示例#1
0
        private async Task LoadData(bool isRefresh)
        {
            try
            {
                SetProgressBar(AppResources.SysTrayGettingItems);

                var query = new SyncJobItemQuery
                {
                    JobId       = SyncJob.Id,
                    TargetId    = ConnectionManager.Device.DeviceId,
                    AddMetadata = true
                };
                var items = await ApiClient.GetSyncJobItems(query);

                if (items != null && !items.Items.IsNullOrEmpty())
                {
                    SyncJobItems = items.Items.Select(x => new SyncJobItemViewModel(x, NavigationService, ConnectionManager, this)).ToObservableCollection();
                }
            }
            catch (HttpException ex)
            {
                Utils.HandleHttpException("LoadData()", ex, NavigationService, Log);
            }

            SetProgressBar();
        }
示例#2
0
        public Dictionary <string, SyncedItemProgress> GetSyncedItemProgresses(SyncJobItemQuery query)
        {
            var result = new Dictionary <string, SyncedItemProgress>();

            var now = DateTime.UtcNow;

            using (var connection = CreateConnection(true).Result)
            {
                using (var cmd = connection.CreateCommand())
                {
                    cmd.CommandText = "select ItemId,Status,Progress from SyncJobItems";

                    var whereClauses = new List <string>();

                    if (!string.IsNullOrWhiteSpace(query.TargetId))
                    {
                        whereClauses.Add("TargetId=@TargetId");
                        cmd.Parameters.Add(cmd, "@TargetId", DbType.String).Value = query.TargetId;
                    }

                    if (query.Statuses.Length > 0)
                    {
                        var statuses = string.Join(",", query.Statuses.Select(i => "'" + i.ToString() + "'").ToArray());

                        whereClauses.Add(string.Format("Status in ({0})", statuses));
                    }

                    if (whereClauses.Count > 0)
                    {
                        cmd.CommandText += " where " + string.Join(" AND ", whereClauses.ToArray());
                    }

                    cmd.CommandText += ";" + cmd.CommandText
                                       .Replace("select ItemId,Status,Progress from SyncJobItems", "select ItemIds,Status,Progress from SyncJobs")
                                       .Replace("'Synced'", "'Completed','CompletedWithError'");

                    //Logger.Debug(cmd.CommandText);

                    using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
                    {
                        LogQueryTime("GetSyncedItemProgresses", cmd, now);

                        while (reader.Read())
                        {
                            AddStatusResult(reader, result, false);
                        }

                        if (reader.NextResult())
                        {
                            while (reader.Read())
                            {
                                AddStatusResult(reader, result, true);
                            }
                        }
                    }
                }
            }

            return(result);
        }
示例#3
0
        public QueryResult <SyncJobItem> GetJobItems(SyncJobItemQuery query)
        {
            var result = _repo.GetJobItems(query);

            if (query.AddMetadata)
            {
                result.Items.ForEach(FillMetadata);
            }

            return(result);
        }
示例#4
0
        public QueryResult <SyncJobItem> GetJobItems(SyncJobItemQuery query)
        {
            var result = _repo.GetJobItems(query);

            if (query.AddMetadata)
            {
                foreach (var item in result.Items)
                {
                    FillMetadata(item);
                }
            }

            return(result);
        }
示例#5
0
 public Dictionary <string, SyncedItemProgress> GetSyncedItemProgresses(SyncJobItemQuery query)
 {
     return(_repo.GetSyncedItemProgresses(query));
 }
示例#6
0
 public QueryResult <SyncedItemProgress> GetSyncedItemProgresses(SyncJobItemQuery query)
 {
     return(_repo.GetSyncedItemProgresses(query));
 }
示例#7
0
 public QueryResult <SyncJobItem> GetJobItems(SyncJobItemQuery query)
 {
     return(GetJobItemReader(query, BaseJobItemSelectText, GetJobItem));
 }
示例#8
0
 public QueryResult <SyncedItemProgress> GetSyncedItemProgresses(SyncJobItemQuery query)
 {
     return(GetJobItemReader(query, "select ItemId,Status from SyncJobItems", GetSyncedItemProgress));
 }
示例#9
0
        private QueryResult <T> GetJobItemReader <T>(SyncJobItemQuery query, string baseSelectText, Func <IDataReader, T> itemFactory)
        {
            if (query == null)
            {
                throw new ArgumentNullException("query");
            }

            using (var cmd = _connection.CreateCommand())
            {
                cmd.CommandText = baseSelectText;

                var whereClauses = new List <string>();

                if (!string.IsNullOrWhiteSpace(query.JobId))
                {
                    whereClauses.Add("JobId=@JobId");
                    cmd.Parameters.Add(cmd, "@JobId", DbType.String).Value = query.JobId;
                }
                if (!string.IsNullOrWhiteSpace(query.ItemId))
                {
                    whereClauses.Add("ItemId=@ItemId");
                    cmd.Parameters.Add(cmd, "@ItemId", DbType.String).Value = query.ItemId;
                }
                if (!string.IsNullOrWhiteSpace(query.TargetId))
                {
                    whereClauses.Add("TargetId=@TargetId");
                    cmd.Parameters.Add(cmd, "@TargetId", DbType.String).Value = query.TargetId;
                }

                if (query.Statuses.Length > 0)
                {
                    var statuses = string.Join(",", query.Statuses.Select(i => "'" + i.ToString() + "'").ToArray());

                    whereClauses.Add(string.Format("Status in ({0})", statuses));
                }

                var whereTextWithoutPaging = whereClauses.Count == 0 ?
                                             string.Empty :
                                             " where " + string.Join(" AND ", whereClauses.ToArray());

                var startIndex = query.StartIndex ?? 0;
                if (startIndex > 0)
                {
                    whereClauses.Add(string.Format("Id NOT IN (SELECT Id FROM SyncJobItems ORDER BY JobItemIndex, DateCreated LIMIT {0})",
                                                   startIndex.ToString(_usCulture)));
                }

                if (whereClauses.Count > 0)
                {
                    cmd.CommandText += " where " + string.Join(" AND ", whereClauses.ToArray());
                }

                cmd.CommandText += " ORDER BY JobItemIndex, DateCreated";

                if (query.Limit.HasValue)
                {
                    cmd.CommandText += " LIMIT " + query.Limit.Value.ToString(_usCulture);
                }

                cmd.CommandText += "; select count (Id) from SyncJobItems" + whereTextWithoutPaging;

                var list  = new List <T>();
                var count = 0;

                using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
                {
                    while (reader.Read())
                    {
                        list.Add(itemFactory(reader));
                    }

                    if (reader.NextResult() && reader.Read())
                    {
                        count = reader.GetInt32(0);
                    }
                }

                return(new QueryResult <T>()
                {
                    Items = list.ToArray(),
                    TotalRecordCount = count
                });
            }
        }
示例#10
0
 public QueryResult <string> GetLibraryItemIds(SyncJobItemQuery query)
 {
     return(_repo.GetLibraryItemIds(query));
 }
示例#11
0
 public QueryResult <string> GetLibraryItemIds(SyncJobItemQuery query)
 {
     return(GetJobItemReader(query, "select ItemId from SyncJobItems", GetItemId));
 }
示例#12
0
        public Dictionary <string, SyncedItemProgress> GetSyncedItemProgresses(SyncJobItemQuery query)
        {
            var result = new Dictionary <string, SyncedItemProgress>();

            var now = DateTime.UtcNow;

            using (WriteLock.Read())
            {
                using (var connection = CreateConnection(true))
                {
                    var commandText  = "select ItemId,Status,Progress from SyncJobItems";
                    var whereClauses = new List <string>();

                    if (!string.IsNullOrWhiteSpace(query.TargetId))
                    {
                        whereClauses.Add("TargetId=@TargetId");
                    }

                    if (query.Statuses.Length > 0)
                    {
                        var statuses = string.Join(",", query.Statuses.Select(i => "'" + i.ToString() + "'").ToArray());

                        whereClauses.Add(string.Format("Status in ({0})", statuses));
                    }

                    if (whereClauses.Count > 0)
                    {
                        commandText += " where " + string.Join(" AND ", whereClauses.ToArray());
                    }

                    var statementTexts = new List <string>
                    {
                        commandText
                    };

                    commandText = commandText
                                  .Replace("select ItemId,Status,Progress from SyncJobItems", "select ItemIds,Status,Progress from SyncJobs")
                                  .Replace("'Synced'", "'Completed','CompletedWithError'");

                    statementTexts.Add(commandText);

                    var statements = connection.PrepareAll(string.Join(";", statementTexts.ToArray()))
                                     .ToList();

                    using (var statement = statements[0])
                    {
                        if (!string.IsNullOrWhiteSpace(query.TargetId))
                        {
                            statement.TryBind("@TargetId", query.TargetId);
                        }

                        foreach (var row in statement.ExecuteQuery())
                        {
                            AddStatusResult(row, result, false);
                        }
                        LogQueryTime("GetSyncedItemProgresses", commandText, now);
                    }

                    now = DateTime.UtcNow;

                    using (var statement = statements[1])
                    {
                        if (!string.IsNullOrWhiteSpace(query.TargetId))
                        {
                            statement.TryBind("@TargetId", query.TargetId);
                        }

                        foreach (var row in statement.ExecuteQuery())
                        {
                            AddStatusResult(row, result, true);
                        }
                        LogQueryTime("GetSyncedItemProgresses", commandText, now);
                    }
                }
            }

            return(result);
        }
示例#13
0
        private QueryResult <T> GetJobItemReader <T>(SyncJobItemQuery query, string baseSelectText, Func <IReadOnlyList <IResultSetValue>, T> itemFactory)
        {
            if (query == null)
            {
                throw new ArgumentNullException("query");
            }

            using (WriteLock.Read())
            {
                using (var connection = CreateConnection(true))
                {
                    var commandText = baseSelectText;
                    var paramList   = new List <object>();

                    var whereClauses = new List <string>();

                    if (!string.IsNullOrWhiteSpace(query.JobId))
                    {
                        whereClauses.Add("JobId=?");
                        paramList.Add(query.JobId);
                    }
                    if (!string.IsNullOrWhiteSpace(query.ItemId))
                    {
                        whereClauses.Add("ItemId=?");
                        paramList.Add(query.ItemId);
                    }
                    if (!string.IsNullOrWhiteSpace(query.TargetId))
                    {
                        whereClauses.Add("TargetId=?");
                        paramList.Add(query.TargetId);
                    }

                    if (query.Statuses.Length > 0)
                    {
                        var statuses = string.Join(",", query.Statuses.Select(i => "'" + i.ToString() + "'").ToArray());

                        whereClauses.Add(string.Format("Status in ({0})", statuses));
                    }

                    var whereTextWithoutPaging = whereClauses.Count == 0 ?
                                                 string.Empty :
                                                 " where " + string.Join(" AND ", whereClauses.ToArray());

                    var startIndex = query.StartIndex ?? 0;
                    if (startIndex > 0)
                    {
                        whereClauses.Add(string.Format("Id NOT IN (SELECT Id FROM SyncJobItems ORDER BY JobItemIndex, DateCreated LIMIT {0})",
                                                       startIndex.ToString(_usCulture)));
                    }

                    if (whereClauses.Count > 0)
                    {
                        commandText += " where " + string.Join(" AND ", whereClauses.ToArray());
                    }

                    commandText += " ORDER BY JobItemIndex, DateCreated";

                    if (query.Limit.HasValue)
                    {
                        commandText += " LIMIT " + query.Limit.Value.ToString(_usCulture);
                    }

                    var list  = new List <T>();
                    var count = connection.Query("select count (Id) from SyncJobItems" + whereTextWithoutPaging, paramList.ToArray())
                                .SelectScalarInt()
                                .First();

                    foreach (var row in connection.Query(commandText, paramList.ToArray()))
                    {
                        list.Add(itemFactory(row));
                    }

                    return(new QueryResult <T>()
                    {
                        Items = list.ToArray(),
                        TotalRecordCount = count
                    });
                }
            }
        }
示例#14
0
        public Dictionary <string, SyncedItemProgress> GetSyncedItemProgresses(SyncJobItemQuery query)
        {
            var result = new Dictionary <string, SyncedItemProgress>();

            using (var connection = CreateConnection(true).Result)
            {
                using (var cmd = connection.CreateCommand())
                {
                    cmd.CommandText = "select ItemId,Status,Progress from SyncJobItems";

                    var whereClauses = new List <string>();

                    if (!string.IsNullOrWhiteSpace(query.TargetId))
                    {
                        whereClauses.Add("TargetId=@TargetId");
                        cmd.Parameters.Add(cmd, "@TargetId", DbType.String).Value = query.TargetId;
                    }

                    if (query.Statuses.Length > 0)
                    {
                        var statuses = string.Join(",", query.Statuses.Select(i => "'" + i.ToString() + "'").ToArray());

                        whereClauses.Add(string.Format("Status in ({0})", statuses));
                    }

                    if (whereClauses.Count > 0)
                    {
                        cmd.CommandText += " where " + string.Join(" AND ", whereClauses.ToArray());
                    }

                    using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult))
                    {
                        while (reader.Read())
                        {
                            var itemId = reader.GetString(0);

                            if (!reader.IsDBNull(1))
                            {
                                var status = (SyncJobItemStatus)Enum.Parse(typeof(SyncJobItemStatus), reader.GetString(1), true);

                                if (status == SyncJobItemStatus.Synced)
                                {
                                    result[itemId] = new SyncedItemProgress
                                    {
                                        Status = SyncJobItemStatus.Synced
                                    };
                                }
                                else
                                {
                                    SyncedItemProgress currentStatus;
                                    double             progress = reader.IsDBNull(2) ? 0.0 : reader.GetDouble(2);

                                    if (!result.TryGetValue(itemId, out currentStatus) || (currentStatus.Status != SyncJobItemStatus.Synced && progress >= currentStatus.Progress))
                                    {
                                        result[itemId] = new SyncedItemProgress
                                        {
                                            Status   = status,
                                            Progress = progress
                                        };
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return(result);
        }