Exemple #1
0
 public void Sync_CopyUpdatesFrom(string tableName, List <DatabaseColumn> columns, DbDataReader syncReader, SyncLogMessageCallback onMessage,
                                  Queue <object> leftovers)
 {
     throw new NotImplementedException();
 }
Exemple #2
0
        public void Sync_CopyUpdatesFrom(string tableName, List <DatabaseColumn> originalColumns, DbDataReader syncReader, SyncLogMessageCallback onMessage, Queue <object> leftovers)
        {
            List <DatabaseColumn> usableColumns = new List <DatabaseColumn>();

            usableColumns.AddRange(originalColumns);

            DatabaseColumn idColumn = Sync.GetIdColumn(usableColumns);

            usableColumns.Remove(idColumn);

            SQLiteConnection connection = GetConnectionForTable(tableName);
            SQLiteCommand    cmd        = connection.CreateCommand();

            StringBuilder sb = new StringBuilder();

            sb.AppendFormat("UPDATE {0} SET ", tableName);
            for (int i = 0; i < usableColumns.Count; i++)
            {
                cmd.Parameters.Add(usableColumns[i].ParameterName, usableColumns[i].DbType);
                sb.AppendFormat("{0} = {1}", usableColumns[i].ColumnName, usableColumns[i].ParameterName);
                if (i != usableColumns.Count - 1)
                {
                    sb.AppendFormat(", ");
                }
            }

            int updatesDone  = 0;
            int nextProgress = 1;

            cmd.Parameters.Add(idColumn.ParameterName, idColumn.DbType);
            sb.AppendFormat(" WHERE {0} = {1}", idColumn.ColumnName, idColumn.ParameterName);
            cmd.CommandText = sb.ToString();

            while (syncReader.Read())
            {
                foreach (DatabaseColumn column in usableColumns)
                {
                    if (column.DbType == DbType.Binary)
                    {
                        byte[] buffer = syncReader.GetByteArray(column.Ordingal);
                        if (buffer != null)
                        {
                            cmd.Parameters[column.ParameterName].Value = buffer;
                        }
                    }
                    else
                    {
                        object o = syncReader.GetValue(column.Ordingal);
                        cmd.Parameters[column.ParameterName].Value = o;
                    }
                }

                cmd.Parameters[idColumn.ParameterName].Value = syncReader.GetValue(idColumn.Ordingal);
                int result = cmd.ExecuteNonQuery();
                switch (result)
                {
                case 0:
                    leftovers.Enqueue(cmd.Parameters[idColumn.ParameterName].Value);
                    break;

                case 1:
                    Console.WriteLine("update ok: {0} {1}", tableName, syncReader.GetValue(idColumn.Ordingal));
                    break;

                default:
                    Console.WriteLine("update failed: {0} {1}", tableName, syncReader.GetValue(idColumn.Ordingal));
                    break;
                }

                if (updatesDone++ == nextProgress)
                {
                    onMessage.Invoke(String.Format("{0} Zeilen in {1} aktualisiert.", nextProgress, tableName));
                    nextProgress *= 2;
                }
            }
            cmd.Dispose();
            syncReader.Dispose();
        }
Exemple #3
0
 public void Sync_CopyFrom(string tableName, List <DatabaseColumn> columns, DbDataReader syncReader, SyncLogMessageCallback onMessage)
 {
     throw new NotImplementedException();
 }
Exemple #4
0
        public void Sync_CopyFrom(string tableName, List <DatabaseColumn> columns, DbDataReader syncReader,
                                  SyncLogMessageCallback onMessage)
        {
            tableName = tableName.MakeFullyQualifiedTableName();
            SQLiteConnection connection = GetConnectionForTable(tableName);
            SQLiteCommand    cmd        = connection.CreateCommand();

            StringBuilder sb = new StringBuilder();

            sb.AppendFormat("INSERT INTO {0} (", tableName);
            for (int i = 0; i < columns.Count; i++)
            {
                sb.AppendFormat("{0}", columns[i].ColumnName);
                if (i != columns.Count - 1)
                {
                    sb.AppendFormat(", ");
                }
            }

            sb.Append(") VALUES (");
            for (int i = 0; i < columns.Count; i++)
            {
                sb.AppendFormat("{0}", columns[i].ParameterName);
                cmd.Parameters.Add(columns[i].ParameterName, columns[i].DbType);
                if (i != columns.Count - 1)
                {
                    sb.AppendFormat(", ");
                }
            }
            sb.Append(")");
            cmd.CommandText = sb.ToString();

            SQLiteTransaction transaction = connection.BeginTransaction();
            DatabaseColumn    idColumn    = columns.Find(x => x.ColumnName.ToLowerInvariant().Equals("id"));

            if (idColumn == null)
            {
                idColumn = columns.Find(x => x.ColumnName.ToLowerInvariant().Equals("screenid"));
            }
            if (idColumn == null)
            {
                idColumn = columns.Find(x => x.ColumnName.ToLowerInvariant().Equals("uid"));
            }
            if (idColumn == null)
            {
                idColumn = columns.Find(x => x.ColumnName.ToLowerInvariant().Equals("scalerid"));
            }
            if (idColumn == null)
            {
                idColumn = columns.Find(x => x.ColumnName.ToLowerInvariant().Equals("char_id"));
            }
            if (idColumn == null)
            {
                idColumn = columns.Find(x => x.ColumnName.ToLowerInvariant().Equals("serial"));
            }
            int successful = 0;

            while (syncReader.Read())
            {
                for (int i = 0; i < columns.Count; i++)
                {
                    DatabaseColumn currentColumn = columns[i];
                    if (currentColumn.DbType == DbType.Time)
                    {
                        TimeSpan copyTimespan  = (TimeSpan)syncReader.GetValue(i);
                        DateTime copyTimespan2 = DateTime.MinValue;
                        copyTimespan2 += copyTimespan;
                        cmd.Parameters[currentColumn.ParameterName].Value = copyTimespan2;
                    }
                    else if (currentColumn.DbType == DbType.Binary)
                    {
                        cmd.Parameters[currentColumn.ParameterName].Value = DBNull.Value;
                        byte[] inBuffer = syncReader.GetByteArray(i);
                        if (inBuffer != null && inBuffer.Length > 0)
                        {
                            cmd.Parameters[currentColumn.ParameterName].Value = inBuffer;
                        }
                    }
                    else
                    {
                        object copyObject = syncReader.GetValue(i);
                        cmd.Parameters[currentColumn.ParameterName].Value = copyObject;
                    }
                }
                int result = cmd.ExecuteNonQuery();
                if (result == 0)
                {
                    throw new SyncException("insert failed");
                }

                if (successful++ % 100 == 0)
                {
                    onMessage.Invoke(String.Format("{0} inserts into {1}", successful, tableName));
                }
            }
            syncReader.Close();
            syncReader.Dispose();
            transaction.Commit();
            transaction.Dispose();
        }