Exemplo n.º 1
0
        Insert(DynamicEntity entity, DateTime now)
        {
            _readerWriterLockSlim.EnterWriteLock();
            try
            {
                if (!_partitions.ContainsKey(entity.PartitionKey))
                {
                    _partitions.Add(entity.PartitionKey, DbPartition.Create(entity.PartitionKey));
                }

                var partition = _partitions[entity.PartitionKey];

                var dbRow = DbRow.CreateNew(entity, now);

                if (partition.Insert(dbRow, now))
                {
                    return(OperationResult.Ok, partition, dbRow);
                }

                return(OperationResult.RecordExists, null, null);
            }
            finally
            {
                _readerWriterLockSlim.ExitWriteLock();
            }
        }
Exemplo n.º 2
0
        public void InitPartitionFromSnapshot(PartitionSnapshot partitionSnapshot)
        {
            _readerWriterLockSlim.EnterWriteLock();
            try
            {
                var partition = DbPartition.Create(partitionSnapshot.PartitionKey);

                if (_partitions.ContainsKey(partitionSnapshot.PartitionKey))
                {
                    return;
                }

                _partitions.Add(partition.PartitionKey, partition);


                var partitionAsMyMemory = new MyMemoryAsByteArray(partitionSnapshot.Snapshot);


                foreach (var dbRowMemory in partitionAsMyMemory.SplitJsonArrayToObjects())
                {
                    var entity = dbRowMemory.ParseDynamicEntity();
                    var dbRow  = DbRow.RestoreSnapshot(entity, dbRowMemory);
                    partition.InsertOrReplace(dbRow);
                }
            }
            finally
            {
                _readerWriterLockSlim.ExitWriteLock();
            }
        }
Exemplo n.º 3
0
        public (DbPartition partition, DbRow dbRow) Insert(IMyNoSqlDbEntity entityInfo, List <MyJsonFirstLevelFieldData> fields)
        {
            ReaderWriterLockSlim.EnterWriteLock();
            try
            {
                if (!_partitions.ContainsKey(entityInfo.PartitionKey))
                {
                    _partitions.Add(entityInfo.PartitionKey, DbPartition.Create(entityInfo.PartitionKey));
                }

                var partition = _partitions[entityInfo.PartitionKey];

                var dbRow = DbRow.CreateNew(entityInfo, fields);

                if (partition.Insert(dbRow))
                {
                    return(partition, dbRow);
                }
            }
            finally
            {
                ReaderWriterLockSlim.ExitWriteLock();
            }

            return(null, null);
        }
Exemplo n.º 4
0
        public void CleanAndBulkInsert(IEnumerable <IMyMemory> itemsAsArray)
        {
            var dbRows = itemsAsArray
                         .Select(arraySpan => arraySpan
                                 .ToDbRow())
                         .ToList();

            _readerWriterLockSlim.EnterWriteLock();

            try
            {
                _partitions.Clear();

                foreach (var dbRow in dbRows)
                {
                    if (!_partitions.ContainsKey(dbRow.PartitionKey))
                    {
                        _partitions.Add(dbRow.PartitionKey, DbPartition.Create(dbRow.PartitionKey));
                    }

                    var partition = _partitions[dbRow.PartitionKey];

                    partition.InsertOrReplace(dbRow);
                }
            }
            finally
            {
                _readerWriterLockSlim.ExitWriteLock();
            }
        }
Exemplo n.º 5
0
 public static SyncPartition Create(DbTable dbTable, DbPartition dbPartition, DataSynchronizationPeriod period)
 {
     return(new SyncPartition
     {
         DbTable = dbTable,
         DbPartition = dbPartition,
         SyncDateTime = DateTime.UtcNow.GetNextPeriod(period)
     });
 }
Exemplo n.º 6
0
        public static void BroadCastInit(DbTable dbTable, DbPartition partition)
        {
            var clientsToSend = Connections.Get(itm => itm.SubscribedToTable(dbTable.Name)).Select(itm => itm.Client);

            byte[] packetToBroadcast = null;

            foreach (var clientProxy in clientsToSend)
            {
                if (packetToBroadcast == null)
                {
                    packetToBroadcast = partition.GetAllRows().ToHubUpdateContract();
                }

                clientProxy.SendAsync(dbTable.Name, "i:" + partition.PartitionKey, packetToBroadcast);
            }
        }
Exemplo n.º 7
0
        public IEnumerable <DbPartition> CleanAndBulkInsert(string partitionKey, IEnumerable <IMyMemory> itemsAsArray)
        {
            var dbRows = itemsAsArray
                         .Select(arraySpan => arraySpan
                                 .ToDbRow())
                         .ToArray();

            _readerWriterLockSlim.EnterWriteLock();



            var result = new Dictionary <string, DbPartition>();

            try
            {
                if (_partitions.ContainsKey(partitionKey))
                {
                    _partitions[partitionKey].Clean();
                }

                foreach (var dbRow in dbRows)
                {
                    if (!_partitions.ContainsKey(dbRow.PartitionKey))
                    {
                        _partitions.Add(dbRow.PartitionKey, DbPartition.Create(dbRow.PartitionKey));
                    }

                    var partition = _partitions[dbRow.PartitionKey];

                    partition.InsertOrReplace(dbRow);

                    if (!result.ContainsKey(dbRow.PartitionKey))
                    {
                        result.Add(dbRow.PartitionKey, partition);
                    }
                }
            }
            finally
            {
                _readerWriterLockSlim.ExitWriteLock();
            }

            return(result.Values);
        }
        public static ValueTask <IActionResult> SynchronizeDeletePartitionAsync(this IActionResult result, DbTable dbTable,
                                                                                DbPartition dbPartition,
                                                                                DataSynchronizationPeriod period)
        {
            if (ServiceLocator.SnapshotStorage == null)
            {
                return(new ValueTask <IActionResult>(result));
            }

            if (period == DataSynchronizationPeriod.Immediately)
            {
                return(result.ResponseWithActionAsync(() => ServiceLocator
                                                      .SnapshotStorage
                                                      .DeleteTablePartitionAsync(dbTable.Name, dbPartition.PartitionKey)));
            }

            ServiceLocator.SnapshotSaverScheduler.SynchronizePartition(dbTable, dbPartition, period);
            return(new ValueTask <IActionResult>(result));
        }
Exemplo n.º 9
0
        public (IEnumerable <DbPartition> partitions, IReadOnlyList <DbRow> rows) BulkInsertOrReplace(
            IEnumerable <IMyMemory> itemsAsArray)
        {
            var dbRows = itemsAsArray
                         .Select(arraySpan => arraySpan.ToDbRow())
                         .ToList();


            var partitionsToSync = new Dictionary <string, DbPartition>();

            var rowsToSync = new List <DbRow>();

            _readerWriterLockSlim.EnterWriteLock();
            try
            {
                foreach (var dbRow in dbRows)
                {
                    if (!_partitions.ContainsKey(dbRow.PartitionKey))
                    {
                        _partitions.Add(dbRow.PartitionKey, DbPartition.Create(dbRow.PartitionKey));
                    }

                    var partition = _partitions[dbRow.PartitionKey];

                    partition.InsertOrReplace(dbRow);

                    if (!partitionsToSync.ContainsKey(partition.PartitionKey))
                    {
                        partitionsToSync.Add(partition.PartitionKey, partition);
                    }

                    rowsToSync.Add(dbRow);
                }
            }
            finally
            {
                _readerWriterLockSlim.ExitWriteLock();
            }


            return(partitionsToSync.Values, rowsToSync);
        }
Exemplo n.º 10
0
        public static void BroadcastInitPartition(DbTable dbTable, DbPartition partition)
        {
            var connections = TableSubscribers.GetConnections(dbTable.Name);

            if (connections == null)
            {
                return;
            }

            var packetToBroadcast = new InitPartitionContract
            {
                TableName    = dbTable.Name,
                PartitionKey = partition.PartitionKey,
                Data         = partition.GetAllRows().ToHubUpdateContract()
            };

            foreach (var connection in connections)
            {
                connection.SendPacket(packetToBroadcast);
            }
        }
Exemplo n.º 11
0
        public void SynchronizePartition(DbTable dbTable, DbPartition partitionToSave, DataSynchronizationPeriod period)
        {
            lock (_lockObject)
            {
                if (CheckIfWeHaveSyncTableTaskEarlier(dbTable.Name, period))
                {
                    return;
                }

                if (!_syncPartitions.ContainsKey(dbTable.Name))
                {
                    _syncPartitions.Add(dbTable.Name, new Dictionary <string, SyncPartition>());
                }

                var dict = _syncPartitions[dbTable.Name];

                if (!dict.ContainsKey(partitionToSave.PartitionKey))
                {
                    dict.Add(partitionToSave.PartitionKey, SyncPartition.Create(dbTable, partitionToSave, period));
                }
            }
        }
Exemplo n.º 12
0
        public (DbPartition partition, DbRow dbRow) InsertOrReplace(DynamicEntity entity, DateTime now)
        {
            _readerWriterLockSlim.EnterWriteLock();
            try
            {
                if (!_partitions.ContainsKey(entity.PartitionKey))
                {
                    _partitions.Add(entity.PartitionKey, DbPartition.Create(entity.PartitionKey));
                }

                var partition = _partitions[entity.PartitionKey];

                var dbRow = DbRow.CreateNew(entity, now);
                partition.InsertOrReplace(dbRow);

                return(partition, dbRow);
            }
            finally
            {
                _readerWriterLockSlim.ExitWriteLock();
            }
        }
Exemplo n.º 13
0
        public DbPartition InitPartitionFromSnapshot(IMyMemory data)
        {
            DbPartition partition = null;

            ReaderWriterLockSlim.EnterWriteLock();
            try
            {
                var initData = new ReadOnlyMemory <byte>(data.AsArray());
                foreach (var dbRowMemory in new[] { initData }.SplitJsonArrayToObjects())
                {
                    var jsonFields = dbRowMemory.ParseFirstLevelOfJson();

                    var entityInfo = jsonFields.GetEntityInfo();

                    if (!_partitions.ContainsKey(entityInfo.PartitionKey))
                    {
                        partition = DbPartition.Create(entityInfo.PartitionKey);
                        _partitions.Add(entityInfo.PartitionKey, partition);
                    }

                    if (partition == null)
                    {
                        partition = _partitions[entityInfo.PartitionKey];
                    }

                    var dbRow = DbRow.RestoreSnapshot(entityInfo, dbRowMemory);

                    partition.InsertOrReplace(dbRow);
                }
            }
            finally
            {
                ReaderWriterLockSlim.ExitWriteLock();
            }

            return(partition);
        }
Exemplo n.º 14
0
 public void PublishInitPartition(DbTable dbTable, DbPartition partition)
 {
 }
Exemplo n.º 15
0
 public void PublishInitPartition(DbTable dbTable, DbPartition partition)
 {
     ChangesHub.BroadCastInit(dbTable, partition);
 }
Exemplo n.º 16
0
        public static PartitionSnapshot Create(DbTable table, DbPartition partition)
        {
            var dbRowsAsByteArray = partition.GetAllRows().ToJsonArray().AsArray();

            return(Create(table.Name, partition.PartitionKey, dbRowsAsByteArray));
        }
        public static ValueTask <IActionResult> SynchronizePartitionAsync(this IActionResult result, DbTable dbTable, DbPartition partitionToSave,
                                                                          DataSynchronizationPeriod period)
        {
            if (ServiceLocator.SnapshotStorage == null)
            {
                return(new ValueTask <IActionResult>(result));
            }

            if (period == DataSynchronizationPeriod.Immediately)
            {
                var partitionSnapshot = PartitionSnapshot.Create(dbTable, partitionToSave);

                return(result.ResponseWithActionAsync(() => ServiceLocator
                                                      .SnapshotStorage
                                                      .SavePartitionSnapshotAsync(partitionSnapshot)));
            }

            ServiceLocator.SnapshotSaverScheduler.SynchronizePartition(dbTable, partitionToSave, period);
            return(new ValueTask <IActionResult>(result));
        }