示例#1
0
        public static ComparableTable FromChainResponse(QueryDataRpcResponse response)
        {
            var pkname  = response.PrimaryKeyName;
            var headers = response.Headers;
            var pkidx   = Array.FindIndex(headers, _ => _ == pkname);
            var rows    = response.Rows
                          .Select(_ => new ComparableRow(headers, _.Cells, _.Cells[pkidx]))
                          .ToArray();

            return(new ComparableTable(headers, rows, pkname));
        }
示例#2
0
        public async Task <(DataTable, QueryDataRpcResponse)> PrepareDataAsync()
        {
            DataTable originDt = null;

            try
            {
                originDt = await GetOriginalDataAsync(this.option.DbConnString, this.option.DbSqlSelect, this.option.DbPkName);
            }
            catch (SqlException ex)
            {
                logger.LogWarning(ex, $"[{this.option.SyncName}]SQL exception when getting data from origin database, ignore sync.");
            }
            catch (Exception ex)
            {
                logger.LogWarning(ex, $"[{this.option.SyncName}]Exception when getting data from origin database, ignore sync.");
            }

            if (originDt == null)
            {
                return(null, null);
            }

            QueryDataRpcResponse targetResp = null;

            try
            {
                targetResp = await GetTargetChainDataAsync(this.option.ChainAddress, this.option.ChainTableName, this.logger);
            }
            catch (ArgumentException ex)
            {
                logger.LogWarning($"[{this.option.SyncName}]: {ex.Message}");
            }
            catch (ApiClientException)
            {
                logger.LogWarning($"[{this.option.SyncName}][{this.option.ChainAddress}]: No Connection, ignore sync.");
            }
            catch (Exception ex)
            {
                logger.LogWarning(ex, $"[{this.option.SyncName}][{this.option.ChainTableName}]: Exception when getting data, ignore sync.");
            }

            return(originDt, targetResp);
        }
示例#3
0
        private static async Task <QueryDataRpcResponse> GetTargetChainDataAsync(string address, string tableName, ILogger logger)
        {
            var tableresponse = await new JsonRpcRequest
            {
                Method = Commands.ListTables,
            }.ConnectAndRequest <ListTablesRpcResponse>(address);
            var tables = tableresponse.Result.Tables;

            if (tables.All(_ => _.Name != tableName))
            {
                throw new ArgumentException($"Table [{tableName}] not exist in target [{address}].");
            }

            var result        = new QueryDataRpcResponse();
            var data          = new List <string>();
            var dataHistories = new List <HistoryEntry>();

            using (var client = new WebApiClient())
            {
                try
                {
                    await client.ConnectAsync(address);
                }
                catch (ApiClientException acex)
                {
                    throw new ApiClientException($"Cannot connect to server {address}, due to {acex.Message}", acex);
                }

                if (!client.IsConnected)
                {
                    throw new ApiClientException($"open channel failed");
                }

                var pos = 0;
                while (true)
                {
                    var request = new JsonRpcRequest
                    {
                        Method     = Commands.QueryData,
                        Parameters = new QueryDataRpcRequest {
                            TableName = tableName, Start = pos, Count = 100,
                        }
                    };
                    var response = await client.RequestAsync <QueryDataRpcResponse>(request);

                    var query = response.Result;
                    if (result.Headers == null)
                    {
                        result.Headers         = query.Headers;
                        result.HeaderHistories = query.HeaderHistories;
                        result.PrimaryKeyName  = query.PrimaryKeyName;
                    }
                    if (query.Rows.Length == 0)
                    {
                        break;
                    }
                    data.AddRange(query.Data);
                    dataHistories.AddRange(query.DataHistories);
                    pos += query.Rows.Length;
                }
            }

            result.Data          = data.ToArray();
            result.DataHistories = dataHistories.ToArray();
            return(result);
        }