public static async Task <HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = "GetFriends/{myPublicKey}")] HttpRequest req,
            string myPublicKey,
            [Table("Friend")] CloudTable friendTable,
            [Table("User")] CloudTable userTable,
            ILogger log)
        {
            log.LogInformation($"C# HTTP trigger {nameof(SubmitFriendRequest)} function processed a request.");


            var privateKey = Utils.ParseToken(req);

            if (privateKey == null)
            {
                return new HttpResponseMessage(HttpStatusCode.Unauthorized)
                       {
                           Content = new StringContent("You are not authorized to make this request.")
                       }
            }
            ;

            if (string.IsNullOrWhiteSpace(myPublicKey))
            {
                return(new HttpResponseMessage(HttpStatusCode.BadRequest)
                {
                    Content = new StringContent("Invalid data to process request")
                });
            }

            try
            {
                var user = await Utils.FindUserEntitySlim(userTable, privateKey, myPublicKey);

                if (user == null)
                {
                    return new HttpResponseMessage(HttpStatusCode.BadRequest)
                           {
                               Content = new StringContent("Unable to locate your user account.")
                           }
                }
                ;
            }
            catch (Exception ex)
            {
                log.LogInformation("User doesn't exist: " + ex.Message);
                return(new HttpResponseMessage(HttpStatusCode.BadRequest)
                {
                    Content = new StringContent("Unable to locate your user account.")
                });
            }


            var statuses = new List <FriendStatus>();

            try
            {
                var publicKeyFilter = TableQuery.GenerateFilterCondition("PartitionKey",
                                                                         QueryComparisons.Equal, myPublicKey);

                var rangeQuery = new TableQuery <FriendEntity>().Where(publicKeyFilter);

                var friends = await friendTable.ExecuteQuerySegmentedAsync(rangeQuery, null);

                // spin off tasks for finding all friends
                var tasks = new List <Task <TableQuerySegment <UserEntity> > >();
                foreach (var f in friends)
                {
                    tasks.Add(Utils.FindFriendTask(userTable, f.RequesteePublicKey));
                }

                await Task.WhenAll(tasks);

                foreach (var t in tasks)
                {
                    var friend = t.Result?.Results?.FirstOrDefault();
                    if (friend == null)
                    {
                        continue;
                    }

                    var friendCode = string.Empty;
                    try
                    {
                        friendCode = Cipher.Decrypt(friend.FriendCode, Utils.FriendCodePassword, friend.PublicKey);
                    }
                    catch (Exception ex)
                    {
                        log.LogError("Unable to decrypt friendcode: " + ex.Message);
                    }

                    statuses.Add(new FriendStatus
                    {
                        AMPrice               = friend.AMPrice,
                        BuyPrice              = friend.BuyPrice,
                        Fruit                 = friend.Fruit,
                        IslandName            = friend.IslandName,
                        Name                  = friend.Name,
                        PMPrice               = friend.PMPrice,
                        PublicKey             = friend.PublicKey,
                        Status                = friend.Status,
                        TimeZone              = friend.TimeZone,
                        TurnipUpdateDayOfYear = friend.TurnipUpdateDayOfYear,
                        TurnipUpdateTimeUTC   = friend.TurnipUpdateTimeUTC,
                        TurnipUpdateYear      = friend.TurnipUpdateYear,
                        FriendCode            = friendCode,
                        MaxPrediction         = friend.MaxPrediction,
                        MinPrediction         = friend.MinPrediction,
                        DodoCode              = friend.DodoCode ?? string.Empty,
                        GateClosesAtUTC       = friend.GateClosesAtUTC.HasValue ? friend.GateClosesAtUTC.Value : DateTime.UtcNow,
                        GateStatus            = friend.GateStatus
                    });
                }
            }
            catch (Exception ex)
            {
                log.LogError($"Error {nameof(GetFriends)} - Error: " + ex.Message);
                return(new HttpResponseMessage(HttpStatusCode.InternalServerError));
            }

            var json = JsonConvert.SerializeObject(statuses);

            return(new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new StringContent(json, Encoding.UTF8, "application/json")
            });
        }
    }
예제 #2
0
        public async Task <T[]> GetAllAsync(TableQuery <T> query)
        {
            var result = await _tableClient.ExecuteQuerySegmentedAsync(query, null);

            return(result.Results.ToArray());
        }
예제 #3
0
 public AzureUtils GetSearchResult(string rowPropertyName, string expectedPropertyValue)
 {
     tableSegment = cloudTable.ExecuteQuerySegmentedAsync(
         new TableQuery().Where(TableQuery.GenerateFilterCondition(rowPropertyName, QueryComparisons.Equal, expectedPropertyValue)), null).Result;
     return(this);
 }
예제 #4
0
        public async Task <ObjectHistoryEntity> GetLastObjectHistoryEntity(string partitionKey, CloudTable table)
        {
            var query = new TableQuery <ObjectHistoryEntity>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey));

            return((await table.ExecuteQuerySegmentedAsync(query.Take(1), null)).SingleOrDefault());
        }
예제 #5
0
 /// <inheritdoc />
 protected override async Task <TableQuerySegment <TElement> > ExecuteAsync(TableQuery <TElement> query, TableContinuationToken token)
 => await _cloudTable.ExecuteQuerySegmentedAsync(query, token);
예제 #6
0
 // Overload 2
 public static Task <TableQuerySegment <T> > ExecuteQuerySegmentedAsync <T>(this CloudTable tbl, TableQuery <T> query, TableContinuationToken continuationToken, CancellationToken token) where T : ITableEntity, new()
 {
     return(tbl.ExecuteQuerySegmentedAsync <T>(query, continuationToken, null, null, token));
 }
예제 #7
0
        public static async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
            [Table("PRIssueMapping")] CloudTable table,
            [Table("IssueRepoMapping")] CloudTable table2,
            [Table("GroupPrefix")] CloudTable table3,
            ILogger log)
        {
            var        PRs       = new List <string>();
            var        Repos     = new List <RepoInfo>();
            var        PullInfo  = new List <PR>();
            dynamic    data      = JObject.Parse(await new StreamReader(req.Body).ReadToEndAsync());
            string     RowKey    = data.key;
            string     prefix    = "";
            string     urlName   = "";
            HttpClient client    = new HttpClient();
            string     url       = "";
            var        byteArray = Encoding.ASCII.GetBytes($":{Environment.GetEnvironmentVariable("AzureDevOps_Setting", EnvironmentVariableTarget.Process)}");

            TableQuery <PRIssueMapping> rangeQuery = new TableQuery <PRIssueMapping>().Where(TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, RowKey));

            foreach (PRIssueMapping issue in await table.ExecuteQuerySegmentedAsync(rangeQuery, null))
            {
                string[] issueSplit = issue.PartitionKey.Split("|");
                prefix = issueSplit[0];
                PRs.Add(issueSplit[1]);
            }
            string[] PRArray = PRs.ToArray();

            TableQuery <GroupPrefix> rangeQuery3 = new TableQuery <GroupPrefix>().Where(TableQuery.GenerateFilterCondition("Prefix", QueryComparisons.Equal, prefix));

            foreach (GroupPrefix repo in await table3.ExecuteQuerySegmentedAsync(rangeQuery3, null))
            {
                string[] urlSplit = repo.PartitionKey.Split(" ");
                urlName = urlSplit[1];
            }

            string PartitionKey = $"{prefix}|{RowKey}";
            TableQuery <PRRepoMapping> rangeQuery2 = new TableQuery <PRRepoMapping>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, PartitionKey));

            foreach (PRRepoMapping repo in await table2.ExecuteQuerySegmentedAsync(rangeQuery2, null))
            {
                url = $"https://dev.azure.com/{urlName}/_apis/git/repositories/{repo.RowKey}?api-version=4.1";
                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url);
                request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
                HttpResponseMessage response = await client.SendAsync(request);

                dynamic repoJSON = JObject.Parse(await response.Content.ReadAsStringAsync());
                string  name     = repoJSON.name;
                Repos.Add(new RepoInfo()
                {
                    status = repo.MergeStatus, repoName = name
                });
            }
            RepoInfo[] RepoArray = Repos.ToArray();


            foreach (string PR in PRArray)
            {
                url = $"https://dev.azure.com/{urlName}/_apis/git/pullrequests/{PR}?api-version=5.1";
                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url);
                request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
                HttpResponseMessage response = await client.SendAsync(request);

                dynamic titleJSON = JObject.Parse(await response.Content.ReadAsStringAsync());
                string  title     = titleJSON.repository.name;
                PullInfo.Add(new PR()
                {
                    ID = PR, name = urlName, repoTitle = title
                });
            }
            PR[] pullInfo = PullInfo.ToArray();

            return(new OkObjectResult(new PRAndRepoResponse()
            {
                PullRequests = pullInfo, Repos = RepoArray
            }));
        }
예제 #8
0
        public static async Task <string> GetActionRequest(//*
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "get-action-request/{act}/{user}/{owner}/{plateNum}")] HttpRequestMessage request,
            string user,
            string act,
            string owner,
            string plateNum,
            [SignalR(HubName = "CounterHub")] IAsyncCollector <SignalRMessage> signalRMessages,
            ILogger log)
        {
            log.LogInformation("GetActionRequest");
            //addition
            CloudTable       table  = null;
            CloudTableClient client = null;

            //first get all users
            try
            {
                StorageCredentials  creds   = new StorageCredentials(Environment.GetEnvironmentVariable("accountName"), Environment.GetEnvironmentVariable("accountKey"));
                CloudStorageAccount account = new CloudStorageAccount(creds, useHttps: true);

                client = account.CreateCloudTableClient();

                table = client.GetTableReference("Requests");
                await table.CreateIfNotExistsAsync();

                Console.WriteLine(table.Uri.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            if (act.Equals("add"))
            {
                //check if it's a new request
                List <Request> requestList = await GetRequests(table, user, true, null);

                string idQuery             = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, plateNum);
                TableQuery <Request> query = new TableQuery <Request>().Where(idQuery);
                var results = await table.ExecuteQuerySegmentedAsync <Request>(query, null);

                foreach (Request e in results.Results)
                {
                    if (e.approved.Equals("waiting"))
                    {
                        if (e.PartitionKey.Equals(user))
                        {
                            return("Failed : the Request arleady suggested ");
                        }
                        else
                        {
                            return("Failed : the Request arleady suggested by another user");
                        }
                    }
                }
                //check if the car arleady regestered
                List <User> cars = await GetRegesteredCar(null, "admin", null);

                foreach (User e in cars)
                {
                    if (e.RowKey.Equals(plateNum))
                    {
                        if (e.UserName.Equals(user))
                        {
                            return("Failed : the car arleady registered by you ");
                        }
                        else
                        {
                            return("Failed : the car arleady registered by another user ");
                        }
                    }
                }
                Request newRequest = new Request();
                newRequest.PartitionKey = user;
                newRequest.RowKey       = plateNum;
                newRequest.ownerName    = owner;
                newRequest.approved     = "waiting";

                TableOperation add = TableOperation.InsertOrReplace(newRequest);
                await table.ExecuteAsync(add);

                await signalRMessages.AddAsync(
                    new SignalRMessage
                {
                    Target    = "requestUpdate",
                    Arguments = new[] { "add" }
                });

                await signalRMessages.AddAsync(
                    new SignalRMessage
                {
                    Target    = "AddRequestNotify",
                    Arguments = new[] { user }
                });
            }
            else
            {//remove
                TableOperation retrieve = TableOperation.Retrieve <Request>(user, plateNum);

                TableResult result = await table.ExecuteAsync(retrieve);

                var deleteEntity = (Request)result.Result;

                TableOperation delete = TableOperation.Delete(deleteEntity);

                await table.ExecuteAsync(delete);

                await signalRMessages.AddAsync(
                    new SignalRMessage
                {
                    Target    = "requestUpdate",
                    Arguments = new[] { "remove:" + plateNum }
                });

                await signalRMessages.AddAsync(
                    new SignalRMessage
                {
                    Target    = "RemoveRequestNotify",
                    Arguments = new[] { user }
                });
            }

            return(act);
        }
예제 #9
0
        public static dynamic GetAzureStorageListingsCore(HttpRequest req, Logging logging)
        {
            string  requestBody     = new System.IO.StreamReader(req.Body).ReadToEndAsync().Result;
            dynamic taskInformation = JsonConvert.DeserializeObject(requestBody);
            string  _TaskInstanceId = taskInformation["TaskInstanceId"].ToString();
            string  _ExecutionUid   = taskInformation["ExecutionUid"].ToString();

            try
            {
                string _storageAccountName = taskInformation["Source"]["StorageAccountName"];
                //The name is actually the base url so we need to parse it to get the name only
                _storageAccountName = _storageAccountName.Split('.')[0].Replace("https://", "");
                string _storageAccountToken = taskInformation["Source"]["StorageAccountToken"];
                Int64  _SourceSystemId      = taskInformation["Source"]["SystemId"];

                TaskMetaDataDatabase TMD = new TaskMetaDataDatabase();
                using SqlConnection _con = TMD.GetSqlConnection();

                var res = _con.QueryWithRetry(string.Format("Select Max(PartitionKey) MaxPartitionKey from AzureStorageListing where SystemId = {0}", _SourceSystemId.ToString()));

                string MaxPartitionKey = DateTime.UtcNow.AddDays(-1).ToString("yyyy-MM-dd hh:mm");

                foreach (var r in res)
                {
                    if (r.MaxPartitionKey != null)
                    {
                        MaxPartitionKey = DateTime.Parse(r.MaxPartitionKey).AddMinutes(-1).ToString("yyyy-MM-dd hh:mm");
                    }
                }

                using (HttpClient SourceClient = new HttpClient())
                {
                    //Now use the SAS URI to connect rather than the MSI / Service Principal as AD Based Auth not yet avail for tables
                    var _storageCredentials  = new StorageCredentials(_storageAccountToken);
                    var SourceStorageAccount = new CloudStorageAccount(storageCredentials: _storageCredentials, accountName: _storageAccountName, endpointSuffix: "core.windows.net", useHttps: true);
                    var client = SourceStorageAccount.CreateCloudTableClient();

                    CloudTable table = client.GetTableReference("Filelist");

                    TableQuery <DynamicTableEntity> query = new TableQuery <DynamicTableEntity>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.GreaterThan, MaxPartitionKey.ToString()));

                    DataTable  dt = new DataTable();
                    DataColumn dc = new DataColumn();
                    dc.ColumnName = "PartitionKey";
                    dc.DataType   = typeof(string);
                    dt.Columns.Add(dc);
                    DataColumn dc1 = new DataColumn();
                    dc1.ColumnName = "RowKey";
                    dc1.DataType   = typeof(string);
                    dt.Columns.Add(dc1);
                    DataColumn dc2 = new DataColumn();
                    dc2.ColumnName = "SystemId";
                    dc2.DataType   = typeof(Int64);
                    dt.Columns.Add(dc2);
                    DataColumn dc3 = new DataColumn();
                    dc3.ColumnName = "FilePath";
                    dc3.DataType   = typeof(string);
                    dt.Columns.Add(dc3);

                    string Filelist = "";
                    TableContinuationToken token = null;
                    do
                    {
                        TableQuerySegment <DynamicTableEntity> resultSegment = table.ExecuteQuerySegmentedAsync(query, token).Result;
                        token = resultSegment.ContinuationToken;

                        //load into data table
                        foreach (var entity in resultSegment.Results)
                        {
                            DataRow dr = dt.NewRow();
                            dr["PartitionKey"] = entity.PartitionKey;
                            dr["RowKey"]       = entity.RowKey;
                            dr["SystemId"]     = _SourceSystemId;
                            dr["FilePath"]     = entity.Properties["FilePath"].StringValue;
                            dt.Rows.Add(dr);
                            Filelist += entity.Properties["FilePath"].StringValue + System.Environment.NewLine;
                        }
                    } while (token != null);


                    if (dt.Rows.Count > 0)
                    {
                        Table t = new Table();
                        t.Schema = "dbo";
                        string TableGuid = Guid.NewGuid().ToString();
                        t.Name = $"#AzureStorageListing{TableGuid}";

                        TMD.BulkInsert(dt, t, true, _con);
                        Dictionary <string, string> SqlParams = new Dictionary <string, string>
                        {
                            { "TempTable", t.QuotedSchemaAndName() },
                            { "SourceSystemId", _SourceSystemId.ToString() }
                        };

                        string MergeSQL = GenerateSQLStatementTemplates.GetSQL(System.IO.Path.Combine(Shared._ApplicationBasePath, Shared._ApplicationOptions.LocalPaths.SQLTemplateLocation), "MergeIntoAzureStorageListing", SqlParams);
                        _con.ExecuteWithRetry(MergeSQL, 120);
                        if ((JArray)taskInformation["Alerts"] != null)
                        {
                            foreach (JObject Alert in (JArray)taskInformation["Alerts"])
                            {
                                //Only Send out for Operator Level Alerts
                                if (Alert["AlertCategory"].ToString() == "Task Specific Operator Alert")
                                {
                                    AlertOperator(_SourceSystemId, Alert["AlertEmail"].ToString(), "", Filelist);
                                }
                            }
                        }
                    }

                    _con.Close();
                    _con.Dispose();
                    TMD.LogTaskInstanceCompletion(System.Convert.ToInt64(_TaskInstanceId), System.Guid.Parse(_ExecutionUid), TaskMetaData.BaseTasks.TaskStatus.Complete, Guid.Empty, "");
                }
            }

            catch (Exception e)
            {
                logging.LogErrors(e);
                TaskMetaDataDatabase TMD = new TaskMetaDataDatabase();
                TMD.LogTaskInstanceCompletion(System.Convert.ToInt64(_TaskInstanceId), System.Guid.Parse(_ExecutionUid), TaskMetaData.BaseTasks.TaskStatus.FailedRetry, Guid.Empty, "Failed when trying to Generate Sas URI and Send Email");

                JObject Root = new JObject
                {
                    ["Result"] = "Failed"
                };

                return(Root);
            }
            return(new { });
        }
예제 #10
0
        internal async Task <QueryResult <T> > QueryAsyncInternalSinglePage <T>(string partitionKey, string rowKey, IEnumerable <QueryFilter> queryFilters = null, int maxItems = 0, TableContinuationToken continuationToken = null) where T : new()
        {
            try
            {
                // notify delegate
                if (_delegate != null)
                {
                    _delegate.OnQuerying(typeof(T), partitionKey, rowKey, maxItems, continuationToken != null);
                }

                // Retrieve a reference to the table.
                CloudTable table = GetTableReference(GetTableName <T>());

                // lookup the entitymapper
                var entityMapper = _entityMapperRegistry[typeof(T)];

                // Construct the query to get all entries
                TableQuery <DynamicTableEntity <T> > query = new TableQuery <DynamicTableEntity <T> >();

                // add partitionkey if exists
                string partitionKeyFilter = null;
                if (partitionKey != null)
                {
                    partitionKeyFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey);
                }

                // add row key if exists
                string rowKeyFilter = null;
                if (rowKey != null)
                {
                    rowKeyFilter = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, rowKey);
                }

                // define the max query items
                if (maxItems > 0)
                {
                    query = query.Take(maxItems);
                }

                // build the query filter
                if (partitionKey != null && rowKey != null)
                {
                    query = query.Where(TableQuery.CombineFilters(partitionKeyFilter, TableOperators.And, rowKeyFilter));
                }
                else if (partitionKey != null && rowKey == null)
                {
                    query = query.Where(partitionKeyFilter);
                }
                else if (partitionKey == null && rowKey != null)
                {
                    throw new Exception("PartitionKey must have a value");
                }

                // build the final query filter
                if (queryFilters != null)
                {
                    foreach (var queryFilter in queryFilters)
                    {
                        var generatedQueryFilter = queryFilter.ToString();

                        if (String.IsNullOrEmpty(query.FilterString))
                        {
                            query.Where(generatedQueryFilter);
                        }
                        else if (queryFilter.FilterType == QueryFilterType.Where || queryFilter.FilterType == QueryFilterType.And)
                        {
                            query.Where(TableQuery.CombineFilters(query.FilterString, TableOperators.And, generatedQueryFilter));
                        }
                        else if (queryFilter.FilterType == QueryFilterType.Or)
                        {
                            query.Where(TableQuery.CombineFilters(query.FilterString, TableOperators.Or, generatedQueryFilter));
                        }
                    }
                }

                // execute the query
                var queryResult = await table.ExecuteQuerySegmentedAsync(query, continuationToken);

                // map all to the original models
                List <T> result = new List <T>();
                foreach (DynamicTableEntity <T> model in queryResult)
                {
                    result.Add(model.Model);
                }

                // notify delegate
                if (_delegate != null)
                {
                    _delegate.OnQueryed(typeof(T), partitionKey, rowKey, maxItems, continuationToken != null, null);
                }

                // done
                return(new QueryResult <T>()
                {
                    Items = result.AsQueryable(),
                    NextToken = queryResult.ContinuationToken
                });
            } catch (Exception e) {
                // check if we have autocreate
                if (_autoCreateTable || e.Message.StartsWith("0:The table specified does not exist", StringComparison.CurrentCulture))
                {
                    // notify delegate
                    if (_delegate != null)
                    {
                        _delegate.OnQueryed(typeof(T), partitionKey, rowKey, maxItems, continuationToken != null, null);
                    }

                    // done
                    return(new QueryResult <T>()
                    {
                        Items = new List <T>().AsQueryable <T>(),
                        NextToken = null
                    });
                }
                else
                {
                    // notify delegate
                    if (_delegate != null)
                    {
                        _delegate.OnQueryed(typeof(T), partitionKey, rowKey, maxItems, continuationToken != null, e);
                    }

                    // throw exception
                    throw e;
                }
            }
        }
예제 #11
0
        public static async Task <bool> MakeQueueAsync(ILogger logger)
        {
            Settings            settings    = Settings.Load();
            CloudStorageAccount account     = CloudStorageAccount.Parse(settings.AzureWebJobsStorage);
            CloudTableClient    tableClient = account.CreateCloudTableClient();
            CloudQueueClient    queueClient = account.CreateCloudQueueClient();
            CloudQueue          jobQueue    = queueClient.GetQueueReference(settings.JobQueueName);

            _ = await jobQueue.CreateIfNotExistsAsync();

            CloudTable jobTable = tableClient.GetTableReference(settings.JobTableName);

            CloudTable jobHistoryTable = tableClient.GetTableReference(settings.JobHistoryTableName);

            _ = await jobHistoryTable.CreateIfNotExistsAsync();

            JobEntity plan = null;
            {
                TableQuery <JobEntity>        query    = new TableQuery <JobEntity>().Take(8);
                TableQuerySegment <JobEntity> segments = await jobTable.ExecuteQuerySegmentedAsync(query, null);

                var jobEntities = segments.Results;
                var ordered     = jobEntities.OrderByDescending(i => i.CreateAt);

                if (ordered.Count() == 0)
                {
                    return(true);
                }

                plan = ordered.First();
            }

            int step = int.Parse(settings.Step);

            if (step <= 0)
            {
                step = DEFAULT_STEP;
            }

            {
                string             targetPath    = settings.TargetPath;
                Uri                uri           = new Uri(targetPath);
                CloudBlobContainer blobContainer = new CloudBlobContainer(uri, account.Credentials);

                int    section   = plan.Current / step;
                string path      = $"{plan.Version}/{plan.PartitionKey}/{section * step}";
                long   fileCount = await StorageHelper.GetBlobFileCountAsync(blobContainer, path, int.Parse(settings.MaxResult));

                if (fileCount <= int.Parse(settings.StepThreshold) && fileCount > 0)
                {
                    logger.LogInformation($"file count {fileCount} less than step threshold");
                    return(true);
                }
            }


            if (plan.Current >= plan.Amount)
            {
                TableOperation delete = TableOperation.Delete(plan);
                _ = await jobTable.ExecuteAsync(delete);

                plan.UpdateAt = DateTime.Now;
                TableOperation insertOrMerge = TableOperation.InsertOrMerge(plan);
                _ = await jobHistoryTable.ExecuteAsync(insertOrMerge);

                return(true);
            }
            else
            {
                int start   = plan.Current;
                int current = plan.Current + step;
                int count   = step;
                if (current > plan.Amount)
                {
                    count        = plan.Amount - plan.Current;
                    plan.Current = plan.Amount;
                }
                else
                {
                    plan.Current += step;
                }
                plan.UpdateAt = DateTime.Now;
                TableOperation insertOrMerge = TableOperation.InsertOrMerge(plan);
                _ = await jobTable.ExecuteAsync(insertOrMerge);

                MakeQueueMessageAsync(jobQueue, plan, start, count, settings.SourcePath, settings.TargetPath);
            }
            return(true);
        }
        public async Task RemoveFromAllRolesAsync(T user)
        {
            bool error = false;
            List <TableUserRole> roles = new List <TableUserRole>();
            string partitionKeyQuery   = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, user.Id);
            TableQuery <TableUserRole>        query        = new TableQuery <TableUserRole>().Where(partitionKeyQuery);
            TableQuerySegment <TableUserRole> querySegment = null;

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

                roles.AddRange(querySegment.Results);
            }

            TableBatchOperation batch = new TableBatchOperation();

            foreach (TableUserRole role in roles)
            {
                role.ETag = "*"; //Delete even if it has changed
                batch.Add(TableOperation.Delete(role));
                if (batch.Count >= 100)
                {
                    try
                    {
                        //Try executing as a batch
                        await _rolesTable.ExecuteBatchAsync(batch);

                        batch.Clear();
                    }
                    catch { }

                    //If a batch wont work, try individually
                    foreach (TableOperation op in batch)
                    {
                        try
                        {
                            await _rolesTable.ExecuteAsync(op);
                        }
                        catch
                        {
                            error = true;
                        }
                    }

                    batch.Clear();
                }
            }
            if (batch.Count > 0)
            {
                try
                {
                    //Try executing as a batch
                    await _rolesTable.ExecuteBatchAsync(batch);

                    batch.Clear();
                }
                catch { }

                //If a batch wont work, try individually
                foreach (TableOperation op in batch)
                {
                    try
                    {
                        await _rolesTable.ExecuteAsync(op);
                    }
                    catch
                    {
                        error = true;
                    }
                }
            }
            if (error)
            {
                throw new Exception();
            }
        }
        public async Task RemoveAllLoginsAsync(T user)
        {
            bool error = false;
            List <TableUserLogin> Logins                    = new List <TableUserLogin>();
            string partitionKeyQuery                        = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, user.Id);
            TableQuery <TableUserLogin>        query        = new TableQuery <TableUserLogin>().Where(partitionKeyQuery);
            TableQuerySegment <TableUserLogin> querySegment = null;

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

                Logins.AddRange(querySegment.Results);
            }

            TableBatchOperation batch      = new TableBatchOperation();
            TableBatchOperation batchIndex = new TableBatchOperation();

            foreach (TableUserLogin login in Logins)
            {
                login.ETag = "*"; //Delete even if it has changed
                batch.Add(TableOperation.Delete(login));
                TableUserLoginProviderKeyIndex providerKeyIndex = new TableUserLoginProviderKeyIndex(user.Id, login.ProviderKey, login.LoginProvider);
                providerKeyIndex.ETag = "*";
                batchIndex.Add(TableOperation.Delete(providerKeyIndex));

                if (batch.Count >= 100 || batchIndex.Count >= 100)
                {
                    try
                    {
                        //Try executing as a batch
                        await _loginTable.ExecuteBatchAsync(batch);

                        batch.Clear();
                    }
                    catch { }

                    //If a batch wont work, try individually
                    foreach (TableOperation op in batch)
                    {
                        try
                        {
                            await _loginTable.ExecuteAsync(op);
                        }
                        catch
                        {
                            error = true;
                        }
                    }

                    //Delete the index individually becase of the partition keys
                    foreach (TableOperation op in batchIndex)
                    {
                        try
                        {
                            await _loginProviderKeyIndexTable.ExecuteAsync(op);
                        }
                        catch
                        {
                            error = true;
                        }
                    }

                    batch.Clear();
                    batchIndex.Clear();
                }
            }
            if (batch.Count > 0 || batchIndex.Count > 0)
            {
                try
                {
                    //Try executing as a batch
                    await _loginTable.ExecuteBatchAsync(batch);

                    batch.Clear();
                }
                // ReSharper disable once EmptyGeneralCatchClause
                catch { }

                //If a batch wont work, try individually
                foreach (TableOperation op in batch)
                {
                    try
                    {
                        await _loginTable.ExecuteAsync(op);
                    }
                    catch
                    {
                        error = true;
                    }
                }

                //Delete the index individually becase of the partition keys
                foreach (TableOperation op in batchIndex)
                {
                    try
                    {
                        await _loginProviderKeyIndexTable.ExecuteAsync(op);
                    }
                    catch
                    {
                        error = true;
                    }
                }
            }

            if (error)
            {
                throw new Exception();
            }
        }
예제 #14
0
        public static async Task <String> updateUser(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "update-User/{act}/{name}")] HttpRequestMessage request,
            [Table("Users")] CloudTable cloudTable,
            string name,
            string act,
            ILogger log)
        {
            Console.Out.WriteLine("in updateUser");
            //addition
            CloudTable       table  = null;
            CloudTableClient client = null;

            try
            {
                StorageCredentials  creds   = new StorageCredentials(Environment.GetEnvironmentVariable("accountName"), Environment.GetEnvironmentVariable("accountKey"));
                CloudStorageAccount account = new CloudStorageAccount(creds, useHttps: true);

                client = account.CreateCloudTableClient();
                table  = client.GetTableReference("Table00" + name);

                Console.WriteLine(table.Uri.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }

            if (act.Equals("remove"))
            {
                Console.Out.WriteLine("in remove");
                //delete table
                await table.DeleteIfExistsAsync();

                //delete user from Users
                TableOperation retrieve   = TableOperation.Retrieve <TableEntity>(name, "");
                CloudTable     usersTable = client.GetTableReference("Users");
                await usersTable.CreateIfNotExistsAsync();

                TableResult result = await usersTable.ExecuteAsync(retrieve);

                var deleteEntity = (TableEntity)result.Result;

                TableOperation delete = TableOperation.Delete(deleteEntity);

                await usersTable.ExecuteAsync(delete);

                //delete requests
                CloudTable           requestTable = client.GetTableReference("Requests");
                TableQuery <Request> idQuery      = new TableQuery <Request>()
                                                    .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, name));
                TableQuerySegment <Request> queryResult = await requestTable.ExecuteQuerySegmentedAsync(idQuery, null);

                var batchOperation = new TableBatchOperation();
                foreach (var e in queryResult.Results)
                {
                    batchOperation.Delete((TableEntity)e);
                }
                if ((queryResult.Results).Count != 0)
                {
                    await requestTable.ExecuteBatchAsync(batchOperation);
                }

                return(act + " " + name);
            }
            else if (act == "add")
            {
                Console.Out.WriteLine("in add");
                await table.CreateIfNotExistsAsync();

                CloudTable usersTable = client.GetTableReference("Users");
                await usersTable.CreateIfNotExistsAsync();

                User newUser = new User();
                newUser.PartitionKey = name;
                newUser.RowKey       = "";
                newUser.Password     = name;
                newUser.UserType     = "user";

                TableOperation add = TableOperation.InsertOrReplace(newUser);
                await usersTable.ExecuteAsync(add);

                return(act + " " + name);
            }
            return(act + " " + name + " error in action");
        }
예제 #15
0
 static Task <IEnumerable <DynamicTableEntity> > GetAllAsync(CloudTable table,
                                                             TableQuery query) =>
 table.ExecuteQuerySegmentedAsync(query, default)
 .Bind(segment => segment.GetAllAsync(table, query));
예제 #16
0
        public static async Task <status> GetIfIsOpen(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "get-isOpen/{id}/{state}")] HttpRequestMessage request,
            string id,
            string state,
            [SignalR(HubName = "CounterHub")] IAsyncCollector <SignalRMessage> signalRMessages,
            ILogger log)
        {
            log.LogInformation("Getting if to open or not.");
            //addition
            CloudTable       table  = null;
            CloudTableClient client = null;

            try
            {
                StorageCredentials  creds   = new StorageCredentials(Environment.GetEnvironmentVariable("accountName"), Environment.GetEnvironmentVariable("accountKey"));
                CloudStorageAccount account = new CloudStorageAccount(creds, useHttps: true);

                client = account.CreateCloudTableClient();

                table = client.GetTableReference("Users");
                await table.CreateIfNotExistsAsync();

                Console.WriteLine(table.Uri.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            status st = new status();

            CloudTable garageTable   = client.GetTableReference("Garage");
            Boolean    isInTheGarage = await isIdInTable(garageTable, "PartitionKey", id);

            /*get the avaliable places*/
            TableQuery <availablePlaces> idQuery = new TableQuery <availablePlaces>()
                                                   .Where(TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, "places"));
            TableQuerySegment <availablePlaces> queryResult = await garageTable.ExecuteQuerySegmentedAsync(idQuery, null);

            availablePlaces places = queryResult.FirstOrDefault();

            if (isInTheGarage && state.Equals("in"))
            {
                st.isOpen = "arleady in the Garage!";
                return(st);
            }
            else if (!isInTheGarage && state.Equals("out"))
            {
                st.isOpen = "arleady out of the Garage!";
                return(st);
            }
            else if (isInTheGarage && state.Equals("out"))
            {
                //remove car from garage
                TableOperation retrieve = TableOperation.Retrieve <Request>(id, "car");
                TableResult    result   = await garageTable.ExecuteAsync(retrieve);

                var            deleteEntity = (TableEntity)result.Result;
                TableOperation delete       = TableOperation.Delete(deleteEntity);
                await garageTable.ExecuteAsync(delete);

                st.isOpen = "open";
                //add one to the avaliavle places
                places.numOfPlaces = (int.Parse(places.numOfPlaces) + 1).ToString();
                //signalR
                await signalRMessages.AddAsync(
                    new SignalRMessage
                {
                    Target    = "placesUpdate",
                    Arguments = new [] { places.numOfPlaces }
                });

                await signalRMessages.AddAsync(
                    new SignalRMessage
                {
                    Target    = "garageUpdate",
                    Arguments = new[] { (Object)id }
                });

                await signalRMessages.AddAsync(
                    new SignalRMessage
                {
                    Target    = ((Request)result.Result).UserName + "Notify",
                    Arguments = new[] { ((Request)result.Result).ownerName + " left the garage" }
                });

                await signalRMessages.AddAsync(
                    new SignalRMessage
                {
                    Target    = "adminNotify",
                    Arguments = new[] { ((Request)result.Result).ownerName + " left the garage" }
                });

                TableOperation add = TableOperation.InsertOrReplace(places);
                await garageTable.ExecuteAsync(add);

                return(st);
            }
            //in
            if (int.Parse(places.numOfPlaces) == 0)
            {
                st.isOpen = "don't open the Garage is FULL!";
                return(st);
            }
            List <String> users = await GetUsersFromTable(table);

            foreach (string regesterdUser in users)
            {
                CloudTable usersTable = client.GetTableReference("Table00" + regesterdUser);
                await usersTable.CreateIfNotExistsAsync();

                Boolean isIdRegestered = await isIdInTable(usersTable, "RowKey", id);

                if (isIdRegestered)
                {
                    //add to garage
                    Request newCar = new Request();
                    newCar.PartitionKey = id;
                    newCar.RowKey       = "car";
                    newCar.ownerName    = ownerName;
                    newCar.UserName     = regesterdUser;

                    TableOperation add = TableOperation.InsertOrReplace(newCar);
                    await garageTable.ExecuteAsync(add);

                    st.isOpen = "open";
                    //update the avaliable places
                    places.numOfPlaces = (int.Parse(places.numOfPlaces) - 1).ToString();
                    await signalRMessages.AddAsync(
                        new SignalRMessage
                    {
                        Target    = "placesUpdate",
                        Arguments = new[] { places.numOfPlaces }
                    });

                    await signalRMessages.AddAsync(
                        new SignalRMessage
                    {
                        Target    = "garageUpdate",
                        Arguments = new[] { (Object)id }
                    });

                    await signalRMessages.AddAsync(
                        new SignalRMessage
                    {
                        Target    = regesterdUser + "Notify",
                        Arguments = new[] { ownerName + " entered the garage" }
                    });

                    await signalRMessages.AddAsync(
                        new SignalRMessage
                    {
                        Target    = "adminNotify",
                        Arguments = new[] { ownerName + " entered the garage" }
                    });

                    TableOperation addOrReplace = TableOperation.InsertOrReplace(places);
                    await garageTable.ExecuteAsync(addOrReplace);

                    return(st);
                }
            }
            st.isOpen = "don't open";
            return(st);
        }
예제 #17
0
        public async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req,
            [Table("blogposts", "AzureWebJobsStorage")] CloudTable table,
            ILogger log)
        {
            try
            {
                // Int default value isn't null so it is assumed to be always included.
                int skip      = Convert.ToInt32(req.Query["skip"]);
                int takeCount = Convert.ToInt32(req.Query["takecount"]);

                req.Query.TryGetValue("filterstring", out var filterString);

                List <string> selectColumns =
                    req.Query.TryGetValue("selectcolumns", out var selectColumnsString) ?
                    JsonConvert.DeserializeObject <List <string> >(selectColumnsString) :
                    new List <string>()
                {
                    "PartitionKey"
                };

                TableContinuationToken token =
                    (req.Query.TryGetValue("newxtpartitionkey", out var nextPk) &&
                     req.Query.TryGetValue("nextrowkey", out var nextRk)) ?
                    new TableContinuationToken()
                {
                    NextPartitionKey = nextPk,
                    NextRowKey       = nextRk,
                    NextTableName    = null,
                    TargetLocation   = StorageLocation.Primary
                } : null;

                while (skip > 0)
                {
                    TableQuerySegment <BlogPostEntity> r = await table.ExecuteQuerySegmentedAsync(
                        new TableQuery <BlogPostEntity>()
                    {
                        TakeCount     = skip,
                        SelectColumns = new List <string>()
                        {
                            "PartitionKey"
                        }
                    },
                        token
                        );

                    skip -= r.Results.Count;
                    token = r.ContinuationToken;
                }

                TableQuerySegment <BlogPostEntity> result = await table.ExecuteQuerySegmentedAsync(
                    new TableQuery <BlogPostEntity>()
                {
                    FilterString  = filterString,
                    SelectColumns = selectColumns,
                    TakeCount     = takeCount
                },
                    token);

                return(new OkObjectResult(new QueryBlogPostEntitiesResponse(token, result.Results)));
            }
            catch (Exception e)
            {
                log.LogError($"function QueryBlogPosts -- caught exception {e} {e.Message} {e.StackTrace}");
                return(new InternalServerErrorResult());
            }
        }
예제 #18
0
        public static async Task <HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = "GetProStatus/{myPublicKey}")] HttpRequest req,
            string myPublicKey,
            [Table("ProStatus")] CloudTable proTable,
            ILogger log)
        {
            log.LogInformation($"C# HTTP trigger {nameof(GetProStatus)} function processed a request.");


            var privateKey = Utils.ParseToken(req);

            if (privateKey == null)
            {
                return new HttpResponseMessage(HttpStatusCode.Unauthorized)
                       {
                           Content = new StringContent("You are not authorized to make this request.")
                       }
            }
            ;

            if (string.IsNullOrWhiteSpace(myPublicKey))
            {
                return(new HttpResponseMessage(HttpStatusCode.BadRequest)
                {
                    Content = new StringContent("Invalid data to process request")
                });
            }



            ProStatus status = null;

            try
            {
                var publicKeyFilter  = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, myPublicKey);
                var privateKeyFilter = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, privateKey);

                var rangeQuery = new TableQuery <ProStatusEntity>().Where(
                    TableQuery.CombineFilters(publicKeyFilter, TableOperators.And, privateKeyFilter));
                var entity = (await proTable.ExecuteQuerySegmentedAsync(rangeQuery, null)).FirstOrDefault();


                status = new ProStatus
                {
                    IsPro   = entity != null,
                    Receipt = entity?.Receipt ?? string.Empty
                };
            }
            catch (Exception ex)
            {
                log.LogError($"Error {nameof(GetFriends)} - Error: " + ex.Message);
                return(new HttpResponseMessage(HttpStatusCode.InternalServerError));
            }

            var json = JsonConvert.SerializeObject(status);

            return(new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new StringContent(json, Encoding.UTF8, "application/json")
            });
        }
    }
예제 #19
0
        public static async Task Run(
            [TimerTrigger("0 0 */4 * * *", RunOnStartup = false)] TimerInfo timer,
            [Table("AuditConfig")] CloudTable configTbl,
            [Table("AuditStats")] CloudTable statsTbl,
            [Table("ResourceTypes")] CloudTable resourceTypesTbl,
            [Queue("resources-to-tag")] ICollector <string> outQueue,
            TraceWriter log)
        {
            _log = log;
            _resourceTypesTbl = resourceTypesTbl;
            log.Info("Starding subscription audit.");

            var resourceTypesQuery = await resourceTypesTbl.ExecuteQuerySegmentedAsync(new TableQuery <ResourceType>(), null);

            _resourceTypes = resourceTypesQuery.Results;
            var auditConfigQuery = await configTbl.ExecuteQuerySegmentedAsync(new TableQuery <AuditConfig>(), null);

            // Init config table if new deployment
            if (auditConfigQuery.Results.Count == 0)
            {
                AuditConfig initConfig = new AuditConfig {
                    SubscriptionId = "enter_valid_subscription_id", RowKey = Guid.NewGuid().ToString(), RequiredTags = "comma,separated,tag,list,here", PartitionKey = "init"
                };
                TableOperation insertOperation = TableOperation.InsertOrReplace(initConfig);
                await configTbl.ExecuteAsync(insertOperation);

                log.Info("First run for new deployment. Please populate the AuditConfig table.");
                return;
            }

            foreach (var auditConfig in auditConfigQuery.Results)
            {
                try
                {
                    AuditStats stats = new AuditStats {
                        JobStart = DateTime.Now, PartitionKey = auditConfig.SubscriptionId, RowKey = Guid.NewGuid().ToString()
                    };
                    IEnumerable <string> requiredTagsList = auditConfig.RequiredTags.Split(',');

                    try
                    {
                        string token = AuthenticationService.GetAccessTokenAsync();
                        _resourceManager = new ResourceManagerService(token);
                    }
                    catch (Exception ex)
                    {
                        log.Error("Unable to connect to the ARM API, Message: " + ex.Message);
                    }

                    List <ResourceItem> tagUpdates = await ProcessResourceGroups(requiredTagsList, auditConfig.SubscriptionId, stats);

                    foreach (ResourceItem resourceItem in tagUpdates)
                    {
                        string messageText = JsonConvert.SerializeObject(resourceItem);
                        _log.Info("Requesting tags for: " + resourceItem.Id);
                        outQueue.Add(messageText);
                    }

                    log.Info("Completed audit of subscription: " + auditConfig.SubscriptionId);
                    stats.JobEnd = DateTime.Now;

                    TableOperation insertOperation = TableOperation.InsertOrReplace(stats);
                    await statsTbl.ExecuteAsync(insertOperation);
                }
                catch (Exception ex)
                {
                    log.Error("Failure processing resource groups for auditConfig: " + auditConfig.RowKey);
                    log.Error(ex.Message);
                }
            }
        }
예제 #20
0
 // Overload #1
 public static Task <TableQuerySegment <DynamicTableEntity> > ExecuteQuerySegmentedAsync(this CloudTable tbl, TableQuery query, TableContinuationToken continuationToken, CancellationToken token)
 {
     return(tbl.ExecuteQuerySegmentedAsync(query, continuationToken, null, null, token));
 }
        private async Task <List <AssignmentLearnContentEntity> > GetAllAssignmentLearnContentEntities(CloudTable assignmentLearnContentTable, string assignmentId)
        {
            TableQuery <AssignmentLearnContentEntity> assignmentSelectedLearnContentQuery = new TableQuery <AssignmentLearnContentEntity>()
                                                                                            .Where(
                TableQuery.GenerateFilterCondition(nameof(TableEntity.PartitionKey), QueryComparisons.Equal, assignmentId)
                );

            List <AssignmentLearnContentEntity> assignmentSelectedLearnContent = new List <AssignmentLearnContentEntity>();
            TableContinuationToken continuationToken = new TableContinuationToken();

            do
            {
                TableQuerySegment <AssignmentLearnContentEntity> querySegment = await assignmentLearnContentTable.ExecuteQuerySegmentedAsync(assignmentSelectedLearnContentQuery, continuationToken);

                continuationToken = querySegment.ContinuationToken;
                assignmentSelectedLearnContent.AddRange(querySegment.Results);
            } while (continuationToken != null);

            return(assignmentSelectedLearnContent);
        }
예제 #22
0
        public static void Main(string[] args)
        {
            if (!ValidateArgs(args))
            {
                return;
            }

            var builder = new ConfigurationBuilder()
                          .AddJsonFile("appsettings.json", optional: true, reloadOnChange: false);

            Configuration = builder.Build();

            IdentityConfiguration sourceConfig = new IdentityConfiguration();

            sourceConfig.TablePrefix             = Configuration.GetSection("source:IdentityConfiguration:TablePrefix")?.Value;
            sourceConfig.StorageConnectionString = Configuration.GetSection("source:IdentityConfiguration:StorageConnectionString")?.Value;
            sourceConfig.LocationMode            = Configuration.GetSection("source:IdentityConfiguration:LocationMode")?.Value ?? string.Empty;
            sourceConfig.UserTableName           = Configuration.GetSection("source:IdentityConfiguration:UserTableName")?.Value ?? string.Empty;
            sourceConfig.IndexTableName          = Configuration.GetSection("source:IdentityConfiguration:IndexTableName")?.Value ?? string.Empty;
            sourceConfig.RoleTableName           = Configuration.GetSection("source:IdentityConfiguration:RoleTableName")?.Value ?? string.Empty;

            IdentityConfiguration targetConfig = new IdentityConfiguration();

            targetConfig.TablePrefix             = Configuration.GetSection("target:IdentityConfiguration:TablePrefix")?.Value;
            targetConfig.StorageConnectionString = Configuration.GetSection("target:IdentityConfiguration:StorageConnectionString")?.Value;
            targetConfig.LocationMode            = Configuration.GetSection("target:IdentityConfiguration:LocationMode")?.Value ?? string.Empty;
            targetConfig.UserTableName           = Configuration.GetSection("target:IdentityConfiguration:UserTableName")?.Value ?? string.Empty;
            targetConfig.IndexTableName          = Configuration.GetSection("target:IdentityConfiguration:IndexTableName")?.Value ?? string.Empty;
            targetConfig.RoleTableName           = Configuration.GetSection("target:IdentityConfiguration:RoleTableName")?.Value ?? string.Empty;


            Console.WriteLine("MaxDegreeOfParallelism: {0}", iMaxdegreesparallel);
            Console.WriteLine("PageSize: {0}", iPageSize);
            Console.WriteLine("MigrateCommand: {0}", MigrateCommand);

            var migration = MigrationFactory.CreateMigration(MigrateCommand);

            using (IdentityCloudContext targetContext = new IdentityCloudContext(targetConfig))
            {
                Task.WhenAll(targetContext.IndexTable.CreateIfNotExistsAsync(),
                             targetContext.UserTable.CreateIfNotExistsAsync(),
                             targetContext.RoleTable.CreateIfNotExistsAsync()).Wait();
                Console.WriteLine($"Target IndexTable: {targetContext.IndexTable.Name}");
                Console.WriteLine($"Target UserTable: {targetContext.UserTable.Name}");
                Console.WriteLine($"Target RoleTable: {targetContext.RoleTable.Name}");

                string entityRecordName = "Users";

                using (IdentityCloudContext sourceContext = new IdentityCloudContext(sourceConfig))
                {
                    Console.WriteLine($"Source IndexTable: {sourceContext.IndexTable.Name}");
                    Console.WriteLine($"Source UserTable: {sourceContext.UserTable.Name}");
                    Console.WriteLine($"Source RoleTable: {sourceContext.RoleTable.Name}");

                    DateTime startLoad   = DateTime.UtcNow;
                    var      allDataList = new List <DynamicTableEntity>(iPageSize);

                    TableQuery tq = migration.GetSourceTableQuery();

                    tq.TakeCount = iPageSize;
                    TableContinuationToken continueToken = new TableContinuationToken();

                    int iSkippedUserCount = 0;
                    int iSkippedPageCount = 0;
                    int iPageCounter      = 0;
                    while (continueToken != null)
                    {
                        DateTime batchStart = DateTime.UtcNow;

                        CloudTable sourceTable = sourceContext.UserTable;
                        if (MigrateCommand == MigrationFactory.Roles)
                        {
                            sourceTable      = sourceContext.RoleTable;
                            entityRecordName = "Role and Role Claims";
                        }
                        var sourceResults = sourceTable.ExecuteQuerySegmentedAsync(tq, continueToken).Result;
                        continueToken = sourceResults.ContinuationToken;


                        int batchCount = sourceResults.Count(migration.UserWhereFilter);
                        iUserTotal += batchCount;
                        iPageCounter++;

                        bool includePage = (iStartPage == -1 || iPageCounter >= iStartPage) && (iFinishPage == -1 || iPageCounter <= iFinishPage);

                        if (includePage)
                        {
                            if (migrateOption)
                            {
                                migration.ProcessMigrate(targetContext, sourceContext, sourceResults.Results, iMaxdegreesparallel,
                                                         () =>
                                {
                                    Interlocked.Increment(ref iUserSuccessConvert);
                                    Console.WriteLine($"{entityRecordName}(s) Complete: {iUserSuccessConvert}");
                                },
                                                         (exMessage) =>
                                {
                                    if (!string.IsNullOrWhiteSpace(exMessage))
                                    {
                                        userIdFailures.Add(exMessage);
                                    }
                                    Interlocked.Increment(ref iUserFailureConvert);
                                });
                            }
                        }
                        else
                        {
                            iSkippedPageCount++;
                            iSkippedUserCount += batchCount;
                        }

                        Console.WriteLine("Page: {2}{3}, {4} Batch: {1}: {0} seconds", (DateTime.UtcNow - batchStart).TotalSeconds, batchCount, iPageCounter, includePage ? string.Empty : "(Skipped)", entityRecordName);

                        //Are we done yet?
                        if (iFinishPage > 0 && iPageCounter >= iFinishPage)
                        {
                            break;
                        }
                    }


                    Console.WriteLine("");
                    Console.WriteLine("Elapsed time: {0} seconds", (DateTime.UtcNow - startLoad).TotalSeconds);
                    Console.WriteLine("Total {2} Skipped: {0}, Total Pages: {1}", iSkippedUserCount, iSkippedPageCount, entityRecordName);
                    Console.WriteLine("Total {2} To Convert: {0}, Total Pages: {1}", iUserTotal - iSkippedUserCount, iPageCounter - iSkippedPageCount, entityRecordName);

                    Console.WriteLine("");
                    if (migrateOption)
                    {
                        Console.WriteLine("Total {1} Successfully Converted: {0}", iUserSuccessConvert, entityRecordName);
                        Console.WriteLine("Total {1} Failed to Convert: {0}", iUserFailureConvert, entityRecordName);
                        if (iUserFailureConvert > 0)
                        {
                            Console.WriteLine($"{entityRecordName} Ids Failed:");
                            foreach (string s in userIdFailures)
                            {
                                Console.WriteLine(s);
                            }
                        }
                    }
                }
            }

            DisplayAnyKeyToExit();
        }
        private List <KeyPhraseCount> GetRecordKeyPhrasesForRecordAssociations(KeyPhraseFilter oFilter)
        {
            List <KeyPhraseCount> keyPhrases = new List <KeyPhraseCount>();

            CloudTable tRecordAssociationKeyphrases = Utils.GetCloudTable("stlprecordassociationkeyphrases", _logger);

            // Create a default query
            TableQuery <RecordKeyPhraseEntity> query = new TableQuery <RecordKeyPhraseEntity>();

            //string finalFilter = "";
            string recordFilter = "";
            //string recordAssociationFilter = "";
            string keyphraseFilter = "";
            string combinedFilter  = "";

            // Add any record association filters
            if (oFilter.records.Count > 0)
            {
                foreach (string rif in oFilter.records)
                {
                    if (rif != null && rif != "")
                    {
                        // Validate the record filter
                        string cleanFilterPKey = Utils.CleanTableKey(rif);
                        if (!cleanFilterPKey.EndsWith("|"))
                        {
                            cleanFilterPKey = cleanFilterPKey + "|";
                        }

                        string pkqueryStart         = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.GreaterThanOrEqual, cleanFilterPKey);
                        string pkqueryEnd           = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.LessThan, Utils.GetLessThanFilter(cleanFilterPKey));
                        string combinedRecordFilter = TableQuery.CombineFilters(pkqueryStart, TableOperators.And, pkqueryEnd);
                        if (recordFilter != "")
                        {
                            recordFilter = TableQuery.CombineFilters(recordFilter, TableOperators.Or, combinedRecordFilter);
                        }
                        else
                        {
                            recordFilter = combinedRecordFilter;
                        }
                    }
                }
            }

            // Add any keyphrase filters
            if (oFilter.keyphrases.Count > 0)
            {
                foreach (string rif in oFilter.keyphrases)
                {
                    string cleanFilterRKey = Utils.CleanTableKey(rif);

                    string rkqueryStart = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThanOrEqual, cleanFilterRKey);
                    string rkqueryEnd   = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThan, Utils.GetLessThanFilter(cleanFilterRKey));

                    string rkqueryCombined = TableQuery.CombineFilters(rkqueryStart, TableOperators.And, rkqueryEnd);

                    if (keyphraseFilter != "")
                    {
                        keyphraseFilter = TableQuery.CombineFilters(keyphraseFilter, TableOperators.Or, rkqueryCombined);
                    }
                    else
                    {
                        keyphraseFilter = rkqueryCombined;
                    }
                }
            }

            // Combine querys if needed
            if (recordFilter.Length > 0)
            {
                if (keyphraseFilter.Length > 0)
                {
                    // Combine queries when both filters are set
                    combinedFilter = TableQuery.CombineFilters(recordFilter, TableOperators.And, keyphraseFilter);
                }
                else
                {
                    combinedFilter = recordFilter;
                }
            }
            else
            {
                if (keyphraseFilter.Length > 0)
                {
                    combinedFilter = keyphraseFilter;
                }
            }

            // Create final combined query
            query = new TableQuery <RecordKeyPhraseEntity>().Where(combinedFilter);


            List <RecordKeyPhraseEntity> keyphraseEntities = new List <RecordKeyPhraseEntity>();
            TableContinuationToken       token             = null;

            var runningQuery = new TableQuery <RecordKeyPhraseEntity>()
            {
                FilterString  = query.FilterString,
                SelectColumns = query.SelectColumns
            };

            do
            {
                runningQuery.TakeCount = query.TakeCount - keyphraseEntities.Count;

                Task <TableQuerySegment <RecordKeyPhraseEntity> > tSeg = tRecordAssociationKeyphrases.ExecuteQuerySegmentedAsync <RecordKeyPhraseEntity>(runningQuery, token);
                tSeg.Wait();
                token = tSeg.Result.ContinuationToken;
                keyphraseEntities.AddRange(tSeg.Result);
            } while (token != null && (query.TakeCount == null || keyphraseEntities.Count < query.TakeCount.Value) && keyphraseEntities.Count < 20000);    //!ct.IsCancellationRequested &&


            //keyphraseEntities.Sort((x, y) => String.Compare(x.RowKey, y.RowKey));

            // Return only distinct keyphrases
            foreach (RecordKeyPhraseEntity kp in keyphraseEntities)
            {
                KeyPhraseCount foundKPCount = keyPhrases.Find(x => (x.KeyPhrase == kp.RowKey));
                if (foundKPCount == null)
                {
                    KeyPhraseCount newKPCount = new KeyPhraseCount(kp.RowKey, 1);
                    keyPhrases.Add(newKPCount);
                }
                else
                {
                    // Increment the number of keyphrases found
                    foundKPCount.Count++;
                }
            }

            // Sort by most common keyphrase in descending order
            keyPhrases.Sort((x, y) => y.Count.CompareTo(x.Count));

            return(keyPhrases);
        }