mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
54e32a96c1
Includes: Bug 722945 - Transactional behavior for store (don't return stored records in subsequent fetch). Bug 709348 - Refactor and improve reconciling and storing of records.
79 lines
2.4 KiB
Java
79 lines
2.4 KiB
Java
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
package org.mozilla.gecko.sync.repositories;
|
|
|
|
/**
|
|
* Our hacky version of transactional semantics. The goal is to prevent
|
|
* the following situation:
|
|
*
|
|
* * AAA is not modified locally.
|
|
* * A modified AAA is downloaded during the storing phase. Its local
|
|
* timestamp is advanced.
|
|
* * The direction of syncing changes, and AAA is now uploaded to the server.
|
|
*
|
|
* The following situation should still be supported:
|
|
*
|
|
* * AAA is not modified locally.
|
|
* * A modified AAA is downloaded and merged with the local AAA.
|
|
* * The merged AAA is uploaded to the server.
|
|
*
|
|
* As should:
|
|
*
|
|
* * AAA is modified locally.
|
|
* * A modified AAA is downloaded, and discarded or merged.
|
|
* * The current version of AAA is uploaded to the server.
|
|
*
|
|
* We achieve this by tracking GUIDs during the storing phase. If we
|
|
* apply a record such that the local copy is substantially the same
|
|
* as the record we just downloaded, we add it to a list of records
|
|
* to avoid uploading. The definition of "substantially the same"
|
|
* depends on the particular repository. The only consideration is "do we
|
|
* want to upload this record in this sync?".
|
|
*
|
|
* Note that items are removed from this list when a fetch that
|
|
* considers them for upload completes successfully. The entire list
|
|
* is discarded when the session is completed.
|
|
*
|
|
* This interface exposes methods to:
|
|
*
|
|
* * During a store, recording that a record has been stored, and should
|
|
* thus not be returned in subsequent fetches;
|
|
* * During a fetch, checking whether a record should be returned.
|
|
*
|
|
* In the future this might also grow self-persistence.
|
|
*
|
|
* See also RepositorySession.trackRecord.
|
|
*
|
|
* @author rnewman
|
|
*
|
|
*/
|
|
public interface StoreTracker {
|
|
|
|
/**
|
|
* @param guid
|
|
* The GUID of the item to track.
|
|
* @return
|
|
* Whether the GUID was a newly tracked value.
|
|
*/
|
|
public boolean trackRecordForExclusion(String guid);
|
|
|
|
/**
|
|
* @param guid
|
|
* The GUID of the item to check.
|
|
* @return
|
|
* true if the item is already tracked.
|
|
*/
|
|
public boolean isTrackedForExclusion(String guid);
|
|
|
|
/**
|
|
*
|
|
* @param guid
|
|
* @return true if the specified GUID was removed from the tracked set.
|
|
*/
|
|
public boolean untrackStoredForExclusion(String guid);
|
|
|
|
public RecordFilter getFilter();
|
|
}
|