コード例 #1
0
ファイル: DeleteRows.cs プロジェクト: kerkesix/satku
        public async Task Execute(params string[] args)
        {
            var parsed = DeleteRowsArguments.Parse(args);

            if (!parsed.Valid)
            {
                Console.Out.WriteLine("Must give target table, partitionkey, and rowid(s).");
                return;
            }

            Console.Out.WriteLine(
                "Deleting rows \r\n{0}\r\n from environment table {1}:{2}.",
                string.Join("\r\n", parsed.RowIds),
                parsed.Target.Environment,
                parsed.Target.TableName);

            var targetTable = new EnvironmentClient(parsed.Target.Environment)
                              .GetTable(parsed.Target.TableName);

            if (!await targetTable.ExistsAsync())
            {
                Console.Out.WriteLine("Target table does not exist, exiting.");
                return;
            }

            var deleteOperations = parsed.RowIds
                                   .Select(rowId => new DynamicTableEntity(parsed.PartitionKey, rowId, "*", new Dictionary <string, EntityProperty>()))
                                   .Select(entity => targetTable.ExecuteAsync(TableOperation.Delete(entity))).ToList();

            await Task.WhenAll(deleteOperations);
        }
コード例 #2
0
ファイル: DeleteTable.cs プロジェクト: kerkesix/satku
        public async Task Execute(params string[] args)
        {
            var  t = new TableTarget(args.Length > 0 ? args[0] : null);
            bool allowProductionDelete = args.Length > 1 && args[1].Equals("--allow-production");

            if (!t.Valid)
            {
                Console.Out.WriteLine("Invalid arguments");
                Console.Out.WriteLine(Usage);
                return;
            }

            // Ensure, that we are not accidentally deleting production tables
            if (!allowProductionDelete && t.Environment.Equals(EnvironmentClient.ProductionSuffix, StringComparison.OrdinalIgnoreCase))
            {
                Console.Out.WriteLine("Cannot delete a table from production.");
                return;
            }

            Console.Out.WriteLine("Deleting table {0} from environment {1}.", t.TableName, t.Environment);

            var targetTable = new EnvironmentClient(t.Environment).GetTable(t.TableName);

            if (!await targetTable.ExistsAsync())
            {
                Console.Out.WriteLine("Target table does not exist, exiting.");
                return;
            }

            await targetTable.DeleteAsync();
        }
コード例 #3
0
ファイル: ChangePartitionKey.cs プロジェクト: kerkesix/satku
        public async Task Execute(params string[] args)
        {
            var parsedArguments = ChangePartitionKeyArguments.Parse(args);

            if (!parsedArguments.Valid)
            {
                Console.WriteLine("Must give source table, row id, and both current and new partition keys.");
                return;
            }

            Console.Out.WriteLine("Changing partition key to {4} for row {0}:{1} {2}-{3}.",
                                  parsedArguments.Source.Environment,
                                  parsedArguments.Source.TableName,
                                  parsedArguments.Partition,
                                  parsedArguments.Id,
                                  parsedArguments.NewPartition);

            var sourceTable = new EnvironmentClient(parsedArguments.Source.Environment).GetTable(parsedArguments.Source.TableName);

            if (!await sourceTable.ExistsAsync())
            {
                Console.Out.WriteLine("Source table does not exist, exiting.");
                return;
            }

            var retrieveRow = TableOperation.Retrieve(parsedArguments.Partition, parsedArguments.Id);

            // TODO: Could use some error handling
            var rowToChange = (DynamicTableEntity)(await sourceTable.ExecuteAsync(retrieveRow)).Result;

            await sourceTable.ExecuteAsync(TableOperation.Delete(rowToChange)).ContinueWith(
                (Task t) => {
                rowToChange.PartitionKey = parsedArguments.NewPartition;
                return(sourceTable.ExecuteAsync(TableOperation.Insert(rowToChange)));
            });
        }
コード例 #4
0
ファイル: QueryEventsBase.cs プロジェクト: kerkesix/satku
        public async Task Execute(params string[] args)
        {
            var stopWatch = Stopwatch.StartNew();

            string target;

            if (!ArgsHelper.GetTargetEnvironmentFromArgs(args, out target, true))
            {
                return;
            }

            string queryArg = args.Length >= 2 ? args[1] : null;

            if (string.IsNullOrWhiteSpace(queryArg))
            {
                Console.Out.WriteLine(this.queryArgumentMissingError);
                return;
            }

            Console.Out.WriteLine(this.queryingInfo, queryArg, target);

            var targetTable = new EnvironmentClient(target).GetTable("events");
            var exists      = await targetTable.ExistsAsync();

            if (!exists)
            {
                Console.Out.WriteLine("Event store does not exist, exiting.");
                return;
            }


            var query = new TableQuery <EventEntity>().Where(this.query(queryArg));
            TableQuerySegment <EventEntity> querySegment = null;
            var foundEntities = new List <EventEntity>();

            while (querySegment == null || querySegment.ContinuationToken != null)
            {
                querySegment = await targetTable.ExecuteQuerySegmentedAsync(
                    query, querySegment != null?querySegment.ContinuationToken : null);

                foundEntities.AddRange(querySegment);
            }

            foreach (var e in foundEntities)
            {
                Console.Out.WriteLine(
                    "PartitionKey:   {0}\r\n"
                    + "RowKey:         {1}\r\n"
                    + "DataType:       {2}\r\n"
                    + "EventTimeStamp: {3}\r\n"
                    + "{4}\r\n",
                    e.PartitionKey,
                    e.RowKey,
                    e.DataType,
                    e.EventTimestamp,
                    e.Data);
            }

            Console.Out.WriteLine("Search complete, found {0:n0} events in {1:n1} seconds.",
                                  foundEntities.Count,
                                  stopWatch.Elapsed.TotalSeconds);

            return;
        }
コード例 #5
0
        public async Task Execute(params string[] args)
        {
            var stopWatch = Stopwatch.StartNew();

            var parsedArguments = TableCopyArguments.Parse(args);

            if (!parsedArguments.Valid)
            {
                Console.WriteLine("Must give source and target, both in a form environmentName:TableName.");
                return;
            }

            Console.Out.WriteLine("Copying {0} from {1} to {2} at {3}.",
                                  parsedArguments.Source.TableName,
                                  parsedArguments.Source.Environment,
                                  parsedArguments.Target.TableName,
                                  parsedArguments.Target.Environment);

            var sourceTable = new EnvironmentClient(parsedArguments.Source.Environment).GetTable(parsedArguments.Source.TableName);
            var targetTable = new EnvironmentClient(parsedArguments.Target.Environment).GetTable(parsedArguments.Target.TableName);

            if (!await sourceTable.ExistsAsync())
            {
                Console.Out.WriteLine("Source table does not exist, exiting.");
                return;
            }

            await targetTable.CreateIfNotExistsAsync();

            var allQuery = new TableQuery <DynamicTableEntity>();
            TableQuerySegment <DynamicTableEntity> querySegment = null;
            var sourceEntities = new List <DynamicTableEntity>();

            while (querySegment == null || querySegment.ContinuationToken != null)
            {
                querySegment = await sourceTable.ExecuteQuerySegmentedAsync(
                    allQuery, querySegment != null?querySegment.ContinuationToken : null);

                sourceEntities.AddRange(querySegment);
            }

            var batches = new List <TableBatchOperation>();
            var groupedByPartitionKey = sourceEntities.GroupBy(
                p => p.PartitionKey,
                e => e,
                (key, list) => new KeyValuePair <string, IEnumerable <DynamicTableEntity> >(key, list));

            foreach (var g in groupedByPartitionKey)
            {
                const int BatchSize = 100;
                int       i         = 1;

                // If batch size is more than 100, chunk it as it is the max sixe for azure storage batch operation
                foreach (var chunk in g.Value.Chunk(BatchSize))
                {
                    Console.Out.WriteLine(g.Key + " - Batch " + i);
                    var batch = new TableBatchOperation();

                    foreach (var entity in chunk)
                    {
                        batch.Insert(entity);
                    }

                    batches.Add(batch);
                    i++;
                }
            }

            Console.Out.WriteLine("This might take a while...");
            var waits = batches.Select(targetTable.ExecuteBatchAsync).Cast <Task>().ToArray();

            Task.WaitAll(waits, TimeSpan.FromHours(1));

            Console.Out.WriteLine("\r\nCopying successful, copied {0:n0} rows in {1:n1} seconds.",
                                  sourceEntities.Count,
                                  stopWatch.Elapsed.TotalSeconds);
            return;
        }