Esempio n. 1
0
        Boolean ProcessPackage(Int64 pkgId)
        {
            var pd       = new ReplicationService.PackageData();
            var counters = new Dictionary <String, Int32>();

            using (var cmd = _cnn.CreateCommand())
            {
                cmd.CommandText = "a2repl.package_content_load_client";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue(String.Empty, (Int32)0).Direction = ParameterDirection.ReturnValue;
                cmd.Parameters.AddWithValue("@pkgid", pkgId);
                using (var rdr = cmd.ExecuteReader())
                {
                    do
                    {
                        var di = new ReplicationService.DataTable();
                        ReadDataTable(di, rdr);
                        while (rdr.Read())
                        {
                            ReadData(di, rdr);
                        }
                        if (pd.Tables == null)
                        {
                            pd.Tables = new List <ReplicationService.DataTable>();
                        }
                        if (!String.IsNullOrEmpty(di.TableName))
                        {
                            pd.Tables.Add(di);
                            if (!counters.ContainsKey(di.TableName))
                            {
                                counters.Add(di.TableName, 0);
                            }
                            counters[di.TableName] += di.Rows.Count;
                        }
                    } while (rdr.NextResult());
                }
                pd.HasMoreData = (Int32)cmd.Parameters[0].Value != 0;
                pd.HasContent  = pd.Tables != null;
                Log.Write("   Id={0} ...", pkgId.ToString());
                _client.SendPackageContent(_clientId, _sessionId, pd);
            }
            using (var cmd = _cnn.CreateCommand())
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = String.Format("a2repl.set_package_client_sent", pkgId);
                cmd.Parameters.AddWithValue("@pkgid", pkgId);
                cmd.ExecuteNonQuery();
            }
            Log.WriteLine("   успешно");
            foreach (var d in counters)
            {
                Log.WriteLine("   \tЭлементов {0} : {1}", d.Key.ToString(), d.Value.ToString());
            }
            return(true);
        }
Esempio n. 2
0
        protected void ReadDataTable(ReplicationService.DataTable Table, IDataReader rdr)
        {
            Table.Columns = new List <ReplicationService.DataColumn>();
            int col = rdr.FieldCount;

            // начинаем с третьей позиции
            // 0=TableName, 1-ItemId, 2-ItemGen
            for (int i = 3; i < col; i++)
            {
                var c = new ReplicationService.DataColumn();
                c.Name     = rdr.GetName(i);
                c.DataType = (ReplicationService.SqlDbType)SqlExtension.GetSqlDbType(rdr.GetDataTypeName(i));
                Table.Columns.Add(c);
            }
        }
 Boolean ProcessItem(Int64 itemId, String itemName)
 {
     if (!_counters.ContainsKey(itemName))
     {
         _counters.Add(itemName, 0);
     }
     ReplicationService.PackageData pd = new ReplicationService.PackageData();
     using (var cmd = _cnn.CreateCommand())
     {
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.CommandText = String.Format("a2repl.get_{0}_for_send", itemName);
         cmd.Parameters.AddWithValue("@id", itemId);
         using (var rdr = cmd.ExecuteReader())
         {
             do
             {
                 var di = new ReplicationService.DataTable();
                 ReadDataTable(di, rdr);
                 while (rdr.Read())
                 {
                     ReadData(di, rdr);
                 }
                 if (pd.Tables == null)
                 {
                     pd.Tables = new List <ReplicationService.DataTable>();
                 }
                 pd.Tables.Add(di);
             } while (rdr.NextResult());
         }
     }
     pd.HasContent = pd.Tables != null;
     Log.Write("\t{0} Id={1}{2} ...", itemName, itemId.ToString(), SqlExtension.Id2String(itemId));
     pd.ItemName = itemName; // обязательно!
     pd.ItemId   = itemId;
     _client.SendPackage(_clientId, _sessionId, pd);
     using (var cmd = _cnn.CreateCommand())
     {
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.CommandText = String.Format("a2repl.set_{0}_sent", itemName);
         cmd.Parameters.AddWithValue("@sessionid", _sessionId);
         cmd.Parameters.AddWithValue("@id", itemId);
         cmd.ExecuteNonQuery();
     }
     Log.WriteLine("   успешно");
     _counters[itemName]++;
     return(true);
 }
Esempio n. 4
0
        protected void ReadData(ReplicationService.DataTable Table, IDataReader rdr)
        {
            if (Table.Rows == null)
            {
                Table.Rows = new List <ReplicationService.DataRow>();
            }
            if (String.IsNullOrWhiteSpace(Table.TableName))
            {
                Table.TableName = rdr.GetString(0);
            }
            int ix = 1;
            var r  = new ReplicationService.DataRow();

            r.Values = new List <String>();
            r.Id     = rdr.GetInt64(ix++);
            r.Gen    = rdr.GetInt32(ix++);
            for (int i = ix; i < rdr.FieldCount; i++)
            {
                r.Values.Add(SqlExtension.ToStringValue(rdr.GetValue(i)));
            }
            Table.Rows.Add(r);
        }
Esempio n. 5
0
        protected void ProcessSingleTable(ReplicationService.DataTable table)
        {
            // %%%% TODO: Наличие параметров в клиентской базе!!!!!
            if ((table.TableName == null) || (table.Columns == null))
            {
                return;
            }
            if (!_counters.ContainsKey(table.TableName))
            {
                _counters.Add(table.TableName, 0);
            }
            if (table.Rows == null)
            {
                return;
            }
            if (table.Columns == null)
            {
                return;
            }
            String cmdText = String.Format("a2repl.{0}_update", table.TableName);

            using (var cmd = _cnn.CreateCommand())
            {
                cmd.CommandText = cmdText;
                cmd.CommandType = CommandType.StoredProcedure;

                SqlCommandBuilder.DeriveParameters(cmd);
                var prmMap = new Dictionary <String, Int32>();
                for (int i = 0; i < cmd.Parameters.Count; i++)
                {
                    prmMap.Add(cmd.Parameters[i].ParameterName, i);
                }

                // Параметры уже прочитаны, добавлять их не нужно

                /*
                 * //cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.BigInt));
                 * //cmd.Parameters.Add(new SqlParameter("@Gen", SqlDbType.Int));
                 * for (int i = 0; i < table.Columns.Count; i++)
                 * {
                 *  var c = table.Columns[i];
                 *  if (prmMap.ContainsKey("@" + c.Name))
                 *      cmd.Parameters.Add(new SqlParameter("@" + c.Name, c.DataType));
                 * }
                 */
                foreach (var r in table.Rows)
                {
                    cmd.Parameters["@Id"].Value  = r.Id;
                    cmd.Parameters["@Gen"].Value = r.Gen;
                    if (r.Values != null)
                    {
                        Debug.Assert(table.Columns.Count == r.Values.Count);
                        for (int i = 0; i < r.Values.Count; i++)
                        {
                            var c       = table.Columns[i];
                            var prmName = "@" + c.Name;
                            if (prmMap.ContainsKey(prmName))
                            {
                                cmd.Parameters[prmName].Value = SqlExtension.ConvertTo(r.Values[i], (SqlDbType)table.Columns[i].DataType);
                            }
                        }
                        cmd.ExecuteNonQuery();
                        _counters[table.TableName]++;
                    }
                }
            }
        }