Пример #1
0
 public override void WriteStructureAfterData(IDatabaseStructure db)
 {
     if (ProgressInfo != null)
     {
         ProgressInfo.SetCurWork("s_creating_references");
     }
     if (m_db.DatabaseCaps.ExecuteSql && !m_db.Dialect.DialectCaps.UncheckedReferences)
     {
         m_db.InvokeScript(dmp =>
         {
             foreach (var table in db.Tables)
             {
                 foreach (var cnt in table.GetConstraints <IForeignKey, IConstraint>())
                 {
                     try
                     {
                         dmp.CreateConstraint(cnt);
                     }
                     catch (Exception err)
                     {
                         ProgressInfo.LogMessageDetail("REFERENCE", LogLevel.Error, Texts.Get("s_error_creating_reference$fk", "fk", cnt.Name), err.ToString());
                     }
                 }
             }
         }, ProgressInfo);
     }
     //foreach (var table in m_dbStruct.Tables)
     //{
     //    var tdst = m_db.GetTable(table.FullName);
     //    tdst.CreateConstraints(table.GetConstraints<IForeignKey, IConstraint>());
     //}
 }
Пример #2
0
        protected override void RunBulkCopy(IDataQueue queue)
        {
            int           okRowCount = 0, failRowCount = 0;
            List <string> insertErrors = new List <string>();

            ITableStructure dst = queue.GetRowFormat;

            var           conn    = (NpgsqlConnection)Connection.SystemConnection;
            NpgsqlCommand command = new NpgsqlCommand(Connection.Dialect.GenerateScript(d => d.Put("^copy %f (%,i) ^from ^stdin", DestinationTable.FullName, from c in dst.Columns select c.ColumnName)), conn);
            NpgsqlCopyIn  cin     = new NpgsqlCopyIn(command, conn);

            try
            {
                cin.Start();
                var fw = new BinaryWriter(cin.CopyStream);
                while (!queue.IsEof)
                {
                    IBedRecord rec = queue.GetRecord();
                    for (int i = 0; i < rec.FieldCount; i++)
                    {
                        if (i > 0)
                        {
                            fw.Write((byte)'\t');
                        }
                        rec.ReadValue(i);
                        WriteField(rec, fw);
                    }
                    fw.Write((byte)'\r');
                    fw.Write((byte)'\n');
                    okRowCount++;
                }
                fw.Flush();
                cin.End();
            }
            catch (Exception err)
            {
                cin.Cancel("canceled");
                ProgressInfo.LogMessageDetail(
                    "INSERT", DatAdmin.LogLevel.Error,
                    String.Format("{0}", Texts.Get("s_error_inserting_into_table$table", "table", DestinationTable.FullName)), err.ToString());
                throw;
            }

            if (failRowCount > 0)
            {
                ProgressInfo.LogMessageDetail(
                    "INSERT", DatAdmin.LogLevel.Error,
                    String.Format("{0}, OK:{1}, FAIL:{2}", Texts.Get("s_error_inserting_into_table$table", "table", DestinationTable.FullName), okRowCount, failRowCount),
                    insertErrors.CreateDelimitedText("\r\n")
                    );
            }
            else
            {
                ProgressInfo.LogMessage("INSERT", DatAdmin.LogLevel.Info, Texts.Get("s_inserted_into_table$table$rows", "table", DestinationTable.FullName, "rows", okRowCount));
            }
        }
Пример #3
0
 protected void ReportFail(string sql, Exception err)
 {
     m_failCount++;
     Logging.Error("Error running command from SQL dump:" + err.ToString());
     if (ProgressInfo != null && m_failCount < FAIL_COUNT_LIMIT)
     {
         ProgressInfo.Error(err.Message);
         ProgressInfo.LogMessageDetail("s_import", LogLevel.Error, Texts.Get("s_error_importing_dump_command"), sql.TrimRightNice(300));
         ProgressInfo.RaiseError("DAE-00156 " + Texts.Get("s_error_importing_dump_command"));
     }
     if (ProgressInfo != null && m_failCount == FAIL_COUNT_LIMIT)
     {
         ProgressInfo.LogMessage("s_import", LogLevel.Error, "s_report_contains_to_many_errors");
     }
 }
Пример #4
0
        protected override void RunBulkCopy(IDataQueue queue)
        {
            int           recsInBatch = 0;
            int           okRowCount = 0, failRowCount = 0;
            List <string> insertErrors = new List <string>();
            StringWriter  buf          = null;
            ISqlDumper    dmp          = null;
            int           maxpacket    = Int32.Parse(Connection.SystemConnection.ExecuteScalar("select @@max_allowed_packet").ToString());

            using (DbTransaction tran = Connection.SystemConnection.BeginTransaction())
            {
                try
                {
                    ITableStructure dst = queue.GetRowFormat;
                    while (!queue.IsEof)
                    {
                        IBedRecord rec = queue.GetRecord();
                        if (recsInBatch == 0)
                        {
                            buf = new StringWriter();
                            dmp = Connection.Dialect.CreateDumper(buf);
                            dmp.Put("^insert ^into %f (%,i) ^values ", DestinationTable.FullName,
                                    from c in dst.Columns select c.ColumnName);
                        }
                        else
                        {
                            dmp.Put(", ");
                        }
                        dmp.Put("(%,v)", rec);
                        recsInBatch++;
                        if (recsInBatch >= BatchSize || buf.GetStringBuilder().Length > maxpacket / 4)
                        {
                            string sql   = buf.ToString();
                            int    bytes = (int)(Encoding.UTF32.GetByteCount(sql) + 0x200);
                            try
                            {
                                Connection.SystemConnection.ExecuteNonQuery(sql, Connection.Dialect);
                                okRowCount += recsInBatch;
                            }
                            catch (Exception err)
                            {
                                failRowCount += recsInBatch;
                                if (insertErrors.Count < 10)
                                {
                                    insertErrors.Add(err.Message);
                                }
                            }
                            recsInBatch = 0;
                        }
                    }
                    if (recsInBatch > 0)
                    {
                        Connection.SystemConnection.ExecuteNonQuery(buf.ToString(), Connection.Dialect);
                        okRowCount += recsInBatch;
                    }
                }
                catch (Exception err)
                {
                    tran.Rollback();
                    ProgressInfo.LogMessageDetail(
                        "INSERT", LogLevel.Error,
                        String.Format("{0}", Texts.Get("s_error_inserting_into_table$table", "table", DestinationTable.FullName)), err.ToString());
                    throw;
                }
                tran.Commit();

                if (failRowCount > 0)
                {
                    ProgressInfo.LogMessageDetail(
                        "INSERT", LogLevel.Error,
                        String.Format("{0}, OK:{1}, FAIL:{2}", Texts.Get("s_error_inserting_into_table$table", "table", DestinationTable.FullName), okRowCount, failRowCount),
                        insertErrors.CreateDelimitedText("\r\n")
                        );
                }
                else
                {
                    ProgressInfo.LogMessage("INSERT", LogLevel.Info, Texts.Get("s_inserted_into_table$table$rows", "table", DestinationTable.FullName, "rows", okRowCount));
                }
            }
        }
Пример #5
0
        protected virtual void RunInserts(IDataQueue queue)
        {
            Connection.SystemConnection.SafeChangeDatabase(DatabaseName);
            var dda = Connection.GetAnyDDA();

            using (DbCommand inscmd = Connection.DbFactory.CreateCommand())
            {
                List <string>   colnames = new List <string>();
                List <string>   vals     = new List <string>();
                ITableStructure ts       = queue.GetRowFormat;
                ITableStructure dst_ts   = DestinationTable;
                foreach (IColumnStructure col in ts.Columns)
                {
                    vals.Add("{" + colnames.Count.ToString() + "}");
                    colnames.Add(col.ColumnName);
                }
                string[]       values         = new string[colnames.Count];
                NameWithSchema table          = DestinationTable.FullName;
                string         insertTemplate = SqlDumper.Format(Connection.Dialect, "^insert ^into %f (%,i) ^values (%,s)", table, colnames, vals);

                bool hasident = HasIdentity(queue);

                DbTransaction trans = Connection.SystemConnection.BeginTransaction();
                inscmd.Connection  = Connection.SystemConnection;
                inscmd.Transaction = trans;

                int           okRowCount = 0, failRowCount = 0;
                List <string> insertErrors = new List <string>();
                try
                {
                    if (hasident)
                    {
                        Connection.RunScript(dmp => { dmp.AllowIdentityInsert(table, true); }, trans, ProgressInfo);
                    }
                    try
                    {
                        int rowcounter = 0;
                        while (!queue.IsEof)
                        {
                            rowcounter++;
                            IBedRecord row = queue.GetRecord();
                            for (int i = 0; i < row.FieldCount; i++)
                            {
                                row.ReadValue(i);
                                values[i] = dda.GetSqlLiteral(row);
                            }
                            inscmd.CommandText = String.Format(insertTemplate, values);

                            if (rowcounter > 10000)
                            {
                                // next transaction
                                trans.Commit();
                                trans.Dispose();
                                trans = Connection.SystemConnection.BeginTransaction();
                                inscmd.Transaction = trans;
                                rowcounter         = 0;
                            }
                            try
                            {
                                inscmd.ExecuteNonQuery();
                                okRowCount++;
                            }
                            catch (Exception err)
                            {
                                if (insertErrors.Count < 10)
                                {
                                    StringBuilder msg = new StringBuilder();
                                    msg.Append(err.Message);
                                    insertErrors.Add(msg.ToString());
                                }
                                failRowCount++;
                            }
                        }
                    }
                    finally
                    {
                        if (hasident)
                        {
                            Connection.RunScript(dmp => { dmp.AllowIdentityInsert(table, false); }, trans, ProgressInfo);
                        }
                    }
                    trans.Commit();
                    if (failRowCount > 0)
                    {
                        ProgressInfo.LogMessageDetail(
                            "INSERT", LogLevel.Error,
                            String.Format("{0}, OK:{1}, FAIL:{2}", Texts.Get("s_error_inserting_into_table$table", "table", DestinationTable.FullName), okRowCount, failRowCount),
                            insertErrors.CreateDelimitedText("\r\n")
                            );
                    }
                    else
                    {
                        ProgressInfo.LogMessage("INSERT", LogLevel.Info, Texts.Get("s_inserted_into_table$table$rows", "table", DestinationTable.FullName, "rows", okRowCount));
                    }
                }
                catch (Exception)
                {
                    trans.Rollback();
                    throw;
                }
            }
        }