コード例 #1
0
        public async Task <bool> TryCreatePermanentReplicaAsync(IReplicaInfo replica)
        {
            var replicaPath = pathHelper.BuildReplicaPath(replica.Environment, replica.Application, replica.Replica);

            var createRequest = new CreateRequest(replicaPath, CreateMode.Persistent)
            {
                Data = ReplicaNodeDataSerializer.Serialize(replica)
            };

            return((await zooKeeperClient.CreateAsync(createRequest).ConfigureAwait(false)).IsSuccessful);
        }
コード例 #2
0
        public static void ResolveItemNoData(IDbConnection connection, ISyncableItemInfo itemInfo,
                                             SyncStatus resolvedStatus, IReplicaInfo modifiedReplica)
        {
            var command = connection.CreateCommand();

            command.CommandText =
                "UPDATE SyncItems SET SyncStatus=@SyncStatus, GlobalModifiedReplica=@ModifiedReplica, ModifiedTickCount=@ModifiedTick WHERE GlobalCreatedReplica=@CreatedReplica AND CreatedTickCount=@CreatedTick AND ItemType=@ItemType";
            command.AddParameter("@SyncStatus", resolvedStatus);
            command.AddParameter("@ItemType", itemInfo.ItemType);
            command.AddParameter("@CreatedReplica", itemInfo.Created.ReplicaId);
            command.AddParameter("@CreatedTick", itemInfo.Created.ReplicaTickCount);
            command.AddParameter("@ModifiedReplica", modifiedReplica.ReplicaId);
            command.AddParameter("@ModifiedTick", modifiedReplica.ReplicaTickCount);
            command.ExecuteNonQuery();
        }
コード例 #3
0
        public ISyncableItemInfo LocateCurrentItemInfo(ISyncableItemInfo source)
        {
            var        typeHandler = HandlerForItemType(source.ItemType);
            IDbCommand command     = _connection.CreateCommand();

            command.CommandText = String.Format("SELECT CreatedReplica, CreatedTickCount, ModifiedReplica, ModifiedTickCount FROM {0} WHERE CreatedReplica=@CreatedReplica AND CreatedTickCount=@CreatedTick", typeHandler.DbTable);
            command.AddParameter("@CreatedReplica", GetLocalReplicaIdForGlobalReplicaId(source.Created.ReplicaId));
            command.AddParameter("@CreatedTick", source.Created.ReplicaTickCount);
            using (IDataReader reader = command.ExecuteReader())
            {
                if (reader.Read())
                {
                    IReplicaInfo createdReplicaInfo  = ReplicaInfoFromDataReader(reader, "Created");
                    IReplicaInfo modifiedReplicaInfo = ReplicaInfoFromDataReader(reader, "Modified");

                    return(new SyncableItemInfo {
                        ItemType = typeHandler.TypeName, Created = createdReplicaInfo, Modified = modifiedReplicaInfo, Deleted = false
                    });
                }
            }

            command             = _connection.CreateCommand();
            command.CommandText = String.Format("SELECT CreatedReplica, CreatedTickCount, ModifiedReplica, ModifiedTickCount FROM {0} WHERE CreatedReplica=@CreatedReplica AND CreatedTickCount=@CreatedTick AND ItemType={1}", "Tombstones", typeHandler.TypeId);
            command.AddParameter("@CreatedReplica", GetLocalReplicaIdForGlobalReplicaId(source.Created.ReplicaId));
            command.AddParameter("@CreatedTick", source.Created.ReplicaTickCount);
            using (IDataReader reader = command.ExecuteReader())
            {
                if (reader.Read())
                {
                    IReplicaInfo createdReplicaInfo  = ReplicaInfoFromDataReader(reader, "Created");
                    IReplicaInfo modifiedReplicaInfo = ReplicaInfoFromDataReader(reader, "Modified");

                    return(new SyncableItemInfo {
                        ItemType = typeHandler.TypeName, Created = createdReplicaInfo, Modified = modifiedReplicaInfo, Deleted = true
                    });
                }
            }

            return(null);
        }
コード例 #4
0
        public string GetDbState()
        {
            JObject state     = new JObject();
            var     knowledge = GenerateLocalKnowledge().OrderBy((ri) => { return(ri.ReplicaId + ri.ReplicaTickCount.ToString()); });

            state.Add("knowledge", SyncUtil.KnowledgeToJson(knowledge));
            foreach (var itemType in GetItemTypes())
            {
                var        handler       = HandlerForItemType(itemType);
                JArray     items         = new JArray();
                IDbCommand selectCommand = _connection.CreateCommand();
                selectCommand.CommandText = String.Format("SELECT CreatedReplica, CreatedTickCount, ModifiedReplica, ModifiedTickCount FROM {0}", handler.DbTable);
                IList <ISyncableItemInfo> itemInfos = new List <ISyncableItemInfo>();
                using (IDataReader reader = selectCommand.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        IReplicaInfo createdReplicaInfo  = ReplicaInfoFromDataReader(reader, "Created");
                        IReplicaInfo modifiedReplicaInfo = ReplicaInfoFromDataReader(reader, "Modified");

                        itemInfos.Add(new SyncableItemInfo {
                            ItemType = handler.TypeName, Created = createdReplicaInfo, Modified = modifiedReplicaInfo, Deleted = false
                        });
                    }
                }


                var sortedItemInfos = itemInfos.OrderBy((ii) => { return(ii.Created.ReplicaId + ii.Created.ReplicaTickCount.ToString()); });
                foreach (var syncItemInfo in sortedItemInfos)
                {
                    JObject builder = SyncUtil.JsonItemFromSyncableItemInfo(syncItemInfo);
                    BuildItemData(syncItemInfo, builder);
                    items.Add(builder);
                }
                state.Add(itemType, items);
            }
            return(state.ToString());
        }
コード例 #5
0
        private IEnumerable <ISyncableItemInfo> LocateChangedOrDeletedItems(ISyncableTypeHandler typeHandler, IEnumerable <IReplicaInfo> remoteKnowledge)
        {
            List <ISyncableItemInfo> changes = new List <ISyncableItemInfo>();

            IDbCommand select = _connection.CreateCommand();

            select.CommandText = GenerateChangeDetectionSQL(remoteKnowledge, typeHandler.DbTable);
            using (IDataReader reader = select.ExecuteReader())
            {
                while (reader.Read())
                {
                    IReplicaInfo createdReplicaInfo  = ReplicaInfoFromDataReader(reader, "Created");
                    IReplicaInfo modifiedReplicaInfo = ReplicaInfoFromDataReader(reader, "Modified");

                    changes.Add(new SyncableItemInfo {
                        ItemType = typeHandler.TypeName, Created = createdReplicaInfo, Modified = modifiedReplicaInfo, Deleted = false
                    });
                }
            }

            select.CommandText  = GenerateChangeDetectionSQL(remoteKnowledge, "Tombstones");
            select.CommandText += String.Format(" AND ItemType={0}", typeHandler.TypeId);
            using (IDataReader reader = select.ExecuteReader())
            {
                while (reader.Read())
                {
                    IReplicaInfo createdReplicaInfo  = ReplicaInfoFromDataReader(reader, "Created");
                    IReplicaInfo modifiedReplicaInfo = ReplicaInfoFromDataReader(reader, "Modified");

                    changes.Add(new SyncableItemInfo {
                        ItemType = typeHandler.TypeName, Created = createdReplicaInfo, Modified = modifiedReplicaInfo, Deleted = true
                    });
                }
            }

            return(changes);
        }
コード例 #6
0
 public DevNullServiceBeacon(IReplicaInfo replicaInfo)
 => ReplicaInfo = replicaInfo;
コード例 #7
0
        private IEnumerable <SyncConflict> CheckForDuplicates(IDbConnection connection)
        {
            var conflicts = new List <SyncConflict>();

            var changedItemInfos = _store.LocateChangedItems(_remoteKnowledge).ToList();

            foreach (string itemType in _store.GetItemTypes())
            {
                IDbCommand getInsertedItemsCommand = connection.CreateCommand();
                getInsertedItemsCommand.CommandText =
                    String.Format(
                        "SELECT ItemID, SyncStatus, ItemType, GlobalCreatedReplica, CreatedTickCount, GlobalModifiedReplica, ModifiedTickCount, ItemData  FROM SyncItems WHERE SyncStatus={0} AND ItemType='{1}'",
                        (int)SyncStatus.Insert, itemType);
                using (IDataReader reader = getInsertedItemsCommand.ExecuteReader())
                {
                    while (reader != null && reader.Read())
                    {
                        long              itemId              = Convert.ToInt64(reader["ItemID"]);
                        IReplicaInfo      createdReplicaInfo  = SessionDbHelper.ReplicaInfoFromDataReader(reader, "Created");
                        IReplicaInfo      modifiedReplicaInfo = SessionDbHelper.ReplicaInfoFromDataReader(reader, "Modified");
                        ISyncableItemInfo remoteItemInfo      = new SyncableItemInfo
                        {
                            ItemType = itemType,
                            Created  = createdReplicaInfo,
                            Modified = modifiedReplicaInfo,
                            Deleted  = false
                        };
                        var remoteItemData = JObject.Parse((string)reader["ItemData"]);

                        foreach (var changedItemInfo in changedItemInfos)
                        {
                            if (changedItemInfo.ItemType != remoteItemInfo.ItemType)
                            {
                                continue;
                            }
                            if (SyncUtil.KnowledgeContains(_remoteKnowledge, changedItemInfo.Created))
                            {
                                continue;
                            }

                            // Inserted here without remote knowledge, could be a dup
                            var builder = SyncUtil.JsonItemFromSyncableItemInfo(changedItemInfo);
                            _store.BuildItemData(changedItemInfo, builder);

                            var localItemData = new JObject {
                                { "item", builder }
                            };

                            DuplicateStatus dupStatus = _store.GetDuplicateStatus(remoteItemInfo.ItemType, localItemData,
                                                                                  remoteItemData);
                            if (dupStatus == DuplicateStatus.Exact)
                            {
                                SessionDbHelper.ReplaceAllItemRefs(connection, _store, remoteItemInfo, changedItemInfo);
                                long         tickCount       = _store.IncrementLocalRepilcaTickCount();
                                IReplicaInfo modifiedReplica = new ReplicaInfo
                                {
                                    ReplicaId        = _store.GetLocalReplicaId(),
                                    ReplicaTickCount = tickCount
                                };
                                SessionDbHelper.ResolveItemNoData(connection, remoteItemInfo,
                                                                  SyncStatus.DeleteNonExisting, modifiedReplica);
                                break;
                            }
                            if (dupStatus == DuplicateStatus.Possible)
                            {
                                // TODO: clean this up, this call does more than we need
                                SessionDbHelper.ResolveItemNoData(connection, remoteItemInfo, SyncStatus.InsertConflict,
                                                                  remoteItemInfo.Modified);
                                conflicts.Add(new SyncConflict(itemId, SyncStatus.InsertConflict, changedItemInfo,
                                                               remoteItemInfo));
                                break;
                            }
                        }
                    }
                }
            }
            return(conflicts);
        }
コード例 #8
0
 /// <summary>
 /// Tries to parse absolute url from <see cref="IReplicaInfo.Replica"/>.
 /// </summary>
 public static bool TryGetUrl([NotNull] this IReplicaInfo replicaInfo, out Uri result) =>
 Uri.TryCreate(replicaInfo.Replica, UriKind.Absolute, out result);
コード例 #9
0
 public static byte[] Serialize(IReplicaInfo replica) => SerializeProperties(replica.Properties);
コード例 #10
0
 public static bool KnowledgeContains(IEnumerable <IReplicaInfo> knowledge, IReplicaInfo replicaInfo)
 {
     return((from reposInfo in knowledge
             where reposInfo.ReplicaId == replicaInfo.ReplicaId
             select reposInfo.ReplicaTickCount >= replicaInfo.ReplicaTickCount).FirstOrDefault());
 }