예제 #1
0
        protected override void UpdateMetadataStoreWithLocalChanges()
        {
            SyncVersion newVersion = new SyncVersion(0, _metaData.GetNextTickCount());

            _metaData.DeleteDetector.MarkAllItemsUnreported();
            foreach (SyncTransferData data in _localItems)
            {
                //Look up an item's metadata by its ID...
                ItemMetadata item = _metaData.FindItemMetadataByUniqueIndexedField(URI_COLUMNNAME, data.Uri);

                if (item == null)
                {
                    //New item, must have been created since that last time the metadata was updated.
                    //Create the item metadata required for sync (giving it a SyncID and a version, defined to be a DWORD and a ULONGLONG
                    //For creates, simply provide the relative replica ID (0) and the tick count for the provider (ever increasing)
                    SyncGlobalId globalId = new SyncGlobalId(0, Guid.NewGuid());
                    item = _metaData.CreateItemMetadata(new SyncId(globalId), newVersion);
                    item.ChangeVersion = newVersion;
                    item.SetCustomField(URI_COLUMNNAME, data.Uri);
                    SaveItemMetadata(item);
                    //Increment sync item counter need for reporting progress info
                    base.RemainingSessionWorkEstimate++;
                }
                else
                {
                    if (data.LastModified > item.GetUInt64Field(TIMESTAMP_COLUMNNAME))                     // the item has changed since the last sync operation.
                    {
                        //Changed Item, this item has changed since the last time the metadata was updated.
                        //Assign a new version by simply stating "who" modified this item (0 = local/me) and "when" (tick count for the store)
                        item.ChangeVersion = newVersion;
                        SaveItemMetadata(item);
                        //Increment sync item counter need for reporting progress info
                        base.RemainingSessionWorkEstimate++;
                    }
                    else
                    {
                        //Unchanged item, nothing has changes so just mark it as live so that the metadata knows it has not been deleted.
                        _metaData.DeleteDetector.ReportLiveItemById(item.GlobalId);
                    }
                }
            }

            //Now go back through the items that are no longer in the store and mark them as deleted in the metadata.
            //This sets the item as a tombstone.
            foreach (ItemMetadata item in _metaData.DeleteDetector.FindUnreportedItems())
            {
                item.MarkAsDeleted(newVersion);
                SaveItemMetadata(item);
            }
        }
예제 #2
0
        public static ItemMetadataAdaptor CreateInstance(ItemMetadata itemMetadata)
        {
            ItemMetadataAdaptor retVal = itemMetadata as ItemMetadataAdaptor;

            //Создаем новый объект и копируем туда свойства
            if (retVal == null)
            {
                retVal = new ItemMetadataAdaptor(new SynchronizationMetadataRow());

                SyncGlobalId syncGlobalId = itemMetadata.GlobalId.GetSyncGlobalId();
                retVal._metadataRow.UniqueId  = syncGlobalId.UniqueId;
                retVal._metadataRow.Prefix    = Convert.ToInt64(syncGlobalId.Prefix);
                retVal._metadataRow.IsDeleted = itemMetadata.IsDeleted;

                retVal.ChangeVersion   = itemMetadata.ChangeVersion;
                retVal.CreationVersion = itemMetadata.CreationVersion;
            }

            return(retVal);
        }
예제 #3
0
        private ItemMetadata CreateMetadataItem(PrimaryKeyId?eventPk)
        {
            if (eventPk == null)
            {
                throw new ArgumentNullException("eventPk");
            }
            SyncVersion newVersion = GetNewSyncVersion();
            //New item, must have been created since that last time the metadata was updated.
            //Create the item metadata required for sync (giving it a SyncID and a version, defined to be a DWORD and a ULONGLONG
            //For creates, simply provide the relative replica ID (0) and the tick count for the provider (ever increasing)
            SyncGlobalId globalId = new SyncGlobalId(0, Guid.NewGuid());
            ItemMetadata retVal   = Provider.ReplicaMetadata.CreateItemMetadata(new SyncId(globalId), newVersion);

            retVal.ChangeVersion = newVersion;
            //Set Uri as pk event
            retVal.SetCustomField(SyncReplicaMetadata.URI_COLUMNNAME, (Guid)eventPk.Value);
            Provider.ReplicaMetadata.SaveItemMetadata(retVal);

            return(retVal);
        }
예제 #4
0
        private ItemMetadata CreateMetadataItem(PrimaryKeyId? eventPk)
        {
            if (eventPk == null)
            {
                throw new ArgumentNullException("eventPk");
            }
            SyncVersion newVersion = GetNewSyncVersion();
            //New item, must have been created since that last time the metadata was updated.
            //Create the item metadata required for sync (giving it a SyncID and a version, defined to be a DWORD and a ULONGLONG
            //For creates, simply provide the relative replica ID (0) and the tick count for the provider (ever increasing)
            SyncGlobalId globalId = new SyncGlobalId(0, Guid.NewGuid());
            ItemMetadata retVal = Provider.ReplicaMetadata.CreateItemMetadata(new SyncId(globalId), newVersion);
            retVal.ChangeVersion = newVersion;
            //Set Uri as pk event
            retVal.SetCustomField(SyncReplicaMetadata.URI_COLUMNNAME, (Guid)eventPk.Value);
            Provider.ReplicaMetadata.SaveItemMetadata(retVal);

            return retVal;
        }