private static async Task <Dictionary <string, Dictionary <string, DynamicTableEntity> > > LoadDataToCache(
            this TableEntitySdk table, Action <int> loadedCallback)
        {
            var buffer = new Dictionary <string, Dictionary <string, DynamicTableEntity> >();

            var loaded = 0;

            await table.GetEntitiesByChunkAsync(chunk =>
            {
                foreach (var entity in chunk)
                {
                    if (!buffer.ContainsKey(entity.PartitionKey))
                    {
                        buffer.Add(entity.PartitionKey, new Dictionary <string, DynamicTableEntity>());
                    }
                    buffer[entity.PartitionKey].Add(entity.RowKey, entity);

                    Console.CursorLeft = 0;
                }

                loaded += chunk.Length;

                loadedCallback(loaded);

                return(Task.FromResult(0));
            });

            return(buffer);
        }
        public CopyPasteEngine(TableEntitySdk srcTable, TableEntitySdk destTable, bool skipBuffer)
        {
            _srcTable   = srcTable;
            _destTable  = destTable;
            _skipBuffer = skipBuffer;

            TheTask = ReadWriteTaskAsync();
        }
        public static async Task VerifyAsync(this TableEntitySdk srcTable, TableEntitySdk destTable)
        {
            //copyPasteEngine.EntitiesBuffer.MatchEntitiesAsync(destTable).Wait();
            var error = await srcTable.EqualToAsync(destTable, i =>
            {
                if (i % 1000 == 0)
                {
                    Console.WriteLine($"   {i} items matched...");
                }
            });

            if (error != null)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Table data does not match!");
                Console.WriteLine(error.Msg);
                Console.ForegroundColor = ConsoleColor.Gray;
            }
            else
            {
                Console.WriteLine("Done with table: " + srcTable.TableName);
            }
        }
Ejemplo n.º 4
0
        public static async Task MatchEntitiesAsync(this TableEntitiesBuffer buffer, TableEntitySdk tableEntitySdk)
        {
            var matched = 0;

            await tableEntitySdk.GetEntitiesByChunkAsync(chunk =>
            {
                return(Task.Run(() =>
                {
                    foreach (var entity in chunk)
                    {
                        if (!buffer.HasEntity(entity))
                        {
                            throw new Exception("Partition " + entity.ToJson() +
                                                " is not found at the dest tablestorage");
                        }
                    }

                    matched += chunk.Length;

                    Console.WriteLine("Matched entities: " + matched);
                }));
            });
        }
        public static async Task <Error> EqualToAsync(this TableEntitySdk src, TableEntitySdk dest, Action <int> onItemAction = null)
        {
            List <Error> errors = new List <Error>();

            var rangeQuery = new TableQuery <DynamicTableEntity>();

            TableContinuationToken srcTableContinuationToken  = null;
            TableContinuationToken destTableContinuationToken = null;

            int chunkCounter = 0;
            int itemCounter  = 0;

            do
            {
                chunkCounter++;
                var srcQuery  = src.CloudTable.ExecuteQuerySegmentedAsync(rangeQuery, srcTableContinuationToken);
                var destQuery = dest.CloudTable.ExecuteQuerySegmentedAsync(rangeQuery, destTableContinuationToken);

                var srcQueryResponse = await srcQuery;
                srcTableContinuationToken = srcQueryResponse.ContinuationToken;
                var srcResult = srcQueryResponse.Results.ToArray();

                var destQueryResponse = await destQuery;
                destTableContinuationToken = destQueryResponse.ContinuationToken;
                var destResult = destQueryResponse.Results.ToArray();

                if (srcResult.Length != destResult.Length)
                {
                    return(new Error
                    {
                        Msg =
                            $"Amount in chunk {chunkCounter} does not match.{Environment.NewLine}Src table: {srcResult.Length}{Environment.NewLine}Dest table: {destResult.Length}"
                    });
                }

                for (int i = 0; i < srcResult.Length; i++, itemCounter++)
                {
                    onItemAction?.Invoke(itemCounter);

                    if (!srcResult[i].EqualTo(destResult[i]))
                    {
                        return(new Error
                        {
                            Msg =
                                $"Chunk: {chunkCounter}{Environment.NewLine}" +
                                $"Item: {i}{Environment.NewLine}" +
                                $"Src object PartitionKey: {srcResult[i].PartitionKey}{Environment.NewLine}" +
                                $"Src object RowKey: {srcResult[i].RowKey}{Environment.NewLine}" +
                                $"Dest object PartitionKey: {destResult[i].PartitionKey}{Environment.NewLine}" +
                                $"Dest object RowKey: {destResult[i].RowKey}{Environment.NewLine}"
                        });
                    }
                }
            } while (srcTableContinuationToken != null);

            //records left in dest storage
            if (destTableContinuationToken != null)
            {
                return new Error
                       {
                           Msg = "Dest table contains more elements"
                       }
            }
            ;

            return(null);
        }
    }