Пример #1
0
        public static async Task DeleteRecordAsync(SqlDatabaseConnection conn, ReplicationTable table,
                                                   string primaryKeyValue)
        {
            await conn.OpenAsync();

            //TODO: first find record line number and delete it from the replication file

            var query = string.Format(DeleteRecordQuery,
                                      Utility.Utility.GetSafeName(table.SchemaName),
                                      Utility.Utility.GetSafeName(table.TableName),
                                      Utility.Utility.GetSafeName(table.Columns.Find(c => c.PrimaryKey == true)
                                                                  .ColumnName),
                                      primaryKeyValue
                                      );

            var cmd = new SqlDatabaseCommand
            {
                Connection  = conn,
                CommandText = query
            };

            cmd.ExecuteNonQuery();

            // check if table exists
            await cmd.ExecuteNonQueryAsync();

            await conn.CloseAsync();
        }
Пример #2
0
        public static async Task <bool> RecordExistsAsync(SqlDatabaseConnection conn, ReplicationTable table,
                                                          string primaryKeyValue)
        {
            await conn.OpenAsync();

            var query = string.Format(RecordExistsQuery,
                                      Utility.Utility.GetSafeName(table.SchemaName),
                                      Utility.Utility.GetSafeName(table.TableName),
                                      Utility.Utility.GetSafeName(table.Columns.Find(c => c.PrimaryKey == true).ColumnName),
                                      primaryKeyValue
                                      );

            var cmd = new SqlDatabaseCommand
            {
                Connection  = conn,
                CommandText = query
            };

            // check if record exists
            var reader = await cmd.ExecuteReaderAsync();

            await reader.ReadAsync();

            var count = (long)reader["c"];
            await conn.CloseAsync();

            return(count != 0);
        }
Пример #3
0
        public static async Task <ReplicationMetaData> GetPreviousReplicationMetaDataAsync(SqlDatabaseConnection conn,
                                                                                           string jobId,
                                                                                           ReplicationTable table)
        {
            try
            {
                ReplicationMetaData replicationMetaData = null;

                // ensure replication metadata table
                await EnsureTableAsync(conn, table);

                // check if metadata exists
                await conn.OpenAsync();

                var query = string.Format(GetMetaDataQuery,
                                          Utility.Utility.GetSafeName(table.SchemaName),
                                          Utility.Utility.GetSafeName(table.TableName),
                                          Utility.Utility.GetSafeName(Constants.ReplicationMetaDataJobId),
                                          jobId);

                var cmd = new SqlDatabaseCommand
                {
                    Connection  = conn,
                    CommandText = query
                };

                var reader = await cmd.ExecuteReaderAsync();

                if (await reader.ReadAsync())
                {
                    // metadata exists
                    var request = JsonConvert.DeserializeObject <PrepareWriteRequest>(
                        reader[Constants.ReplicationMetaDataRequest].ToString());
                    var shapeName = reader[Constants.ReplicationMetaDataReplicatedShapeName]
                                    .ToString();
                    var shapeId = reader[Constants.ReplicationMetaDataReplicatedShapeId]
                                  .ToString();
                    var timestamp = DateTime.Parse(reader[Constants.ReplicationMetaDataTimestamp]
                                                   .ToString());

                    replicationMetaData = new ReplicationMetaData
                    {
                        Request             = request,
                        ReplicatedShapeName = shapeName,
                        ReplicatedShapeId   = shapeId,
                        Timestamp           = timestamp
                    };
                }

                await conn.CloseAsync();

                return(replicationMetaData);
            }
            catch (Exception e)
            {
                Logger.Error(e, e.Message);
                throw;
            }
        }
Пример #4
0
        public static async Task <Dictionary <string, object> > GetRecordAsync(SqlDatabaseConnection conn,
                                                                               ReplicationTable table,
                                                                               string primaryKeyValue)
        {
            await conn.OpenAsync();

            var query = string.Format(GetRecordQuery,
                                      Utility.Utility.GetSafeName(table.SchemaName),
                                      Utility.Utility.GetSafeName(table.TableName),
                                      Utility.Utility.GetSafeName(table.Columns.Find(c => c.PrimaryKey == true).ColumnName),
                                      primaryKeyValue
                                      );

            var cmd = new SqlDatabaseCommand
            {
                Connection  = conn,
                CommandText = query
            };


            var reader = await cmd.ExecuteReaderAsync();

            Dictionary <string, object> recordMap = null;

            // check if record exists
            if (reader.HasRows)
            {
                await reader.ReadAsync();

                recordMap = new Dictionary <string, object>();

                foreach (var column in table.Columns)
                {
                    try
                    {
                        recordMap[column.ColumnName] = reader[column.ColumnName];
                    }
                    catch (Exception e)
                    {
                        Logger.Error(e, $"No column with column name: {column.ColumnName}");
                        Logger.Error(e, e.Message);
                        recordMap[column.ColumnName] = null;
                    }
                }
            }

            await conn.CloseAsync();

            return(recordMap);
        }
Пример #5
0
        // private static readonly string EnsureTableQuery = @"SELECT * FROM {0}.{1}";

        public static async Task EnsureTableAsync(SqlDatabaseConnection conn, ReplicationTable table)
        {
            // create table
            var querySb       = new StringBuilder($@"CREATE TABLE IF NOT EXISTS 
{Utility.Utility.GetSafeName(table.SchemaName)}.{Utility.Utility.GetSafeName(table.TableName)}(");
            var primaryKeySb  = new StringBuilder("PRIMARY KEY (");
            var hasPrimaryKey = false;

            foreach (var column in table.Columns)
            {
                querySb.Append(
                    $"{Utility.Utility.GetSafeName(column.ColumnName)} {column.DataType}{(column.PrimaryKey ? " NOT NULL UNIQUE" : "")},");
                if (column.PrimaryKey)
                {
                    primaryKeySb.Append($"{Utility.Utility.GetSafeName(column.ColumnName)},");
                    hasPrimaryKey = true;
                }
            }

            if (hasPrimaryKey)
            {
                primaryKeySb.Length--;
                primaryKeySb.Append(")");
                querySb.Append($"{primaryKeySb});");
            }
            else
            {
                querySb.Length--;
                querySb.Append(");");
            }

            await conn.OpenAsync();

            var query = querySb.ToString();

            Logger.Debug($"Creating Table: {query}");

            var cmd = new SqlDatabaseCommand
            {
                Connection  = conn,
                CommandText = query
            };

            await cmd.ExecuteNonQueryAsync();

            await conn.CloseAsync();
        }
Пример #6
0
        public static async Task DropTableAsync(SqlDatabaseConnection conn, ReplicationTable table)
        {
            await conn.OpenAsync();

            // TODO: delete file from disk

            var query = string.Format(DropTableQuery,
                                      Utility.Utility.GetSafeName(table.SchemaName),
                                      Utility.Utility.GetSafeName(table.TableName)
                                      );

            var cmd = new SqlDatabaseCommand
            {
                Connection  = conn,
                CommandText = query
            };

            cmd.ExecuteNonQuery();

            await conn.CloseAsync();
        }
Пример #7
0
        public static async Task UpsertRecordAsync(SqlDatabaseConnection conn,
                                                   ReplicationTable table,
                                                   Dictionary <string, object> recordMap)
        {
            var primaryKey   = table.Columns.Find(c => c.PrimaryKey);
            var primaryValue = recordMap[primaryKey.ColumnName];

            if (await RecordExistsAsync(conn, table, primaryValue.ToString()))
            {
                // update data
                try
                {
                    Logger.Debug($"Updating record: {primaryValue}");

                    await conn.OpenAsync();

                    var querySb =
                        new StringBuilder(
                            $"UPDATE {Utility.Utility.GetSafeName(table.SchemaName)}.{Utility.Utility.GetSafeName(table.TableName)} SET ");
                    foreach (var column in table.Columns)
                    {
                        if (!column.PrimaryKey)
                        {
                            if (recordMap.ContainsKey(column.ColumnName))
                            {
                                var rawValue = recordMap[column.ColumnName];
                                if (rawValue == null || string.IsNullOrWhiteSpace(rawValue.ToString()))
                                {
                                    querySb.Append($"{Utility.Utility.GetSafeName(column.ColumnName)}=NULL,");
                                }
                                else
                                {
                                    if (column.Serialize)
                                    {
                                        rawValue = JsonConvert.SerializeObject(rawValue);
                                    }

                                    querySb.Append(
                                        $"{Utility.Utility.GetSafeName(column.ColumnName)}='{Utility.Utility.GetSafeString(rawValue.ToString())}',");
                                }
                            }
                            else
                            {
                                querySb.Append($"{Utility.Utility.GetSafeName(column.ColumnName)}=NULL,");
                            }
                        }
                    }

                    querySb.Length--;

                    if (primaryKey.Serialize)
                    {
                        primaryValue = JsonConvert.SerializeObject(primaryValue);
                    }

                    querySb.Append(
                        $" WHERE {Utility.Utility.GetSafeName(primaryKey.ColumnName)}='{Utility.Utility.GetSafeString(primaryValue.ToString())}'");

                    var query = querySb.ToString();

                    Logger.Debug($"Update record query: {query}");

                    var cmd = new SqlDatabaseCommand
                    {
                        Connection  = conn,
                        CommandText = query
                    };

                    await cmd.ExecuteNonQueryAsync();
                }
                catch (Exception e)
                {
                    await conn.CloseAsync();

                    Logger.Error(e, $"Error Update: {e.Message}");
                    throw;
                }
                finally
                {
                    await conn.CloseAsync();
                }
            }
            else
            {
                // insert data
                try
                {
                    Logger.Debug($"Inserting record: {primaryValue}");

                    await conn.OpenAsync();

                    // try to insert
                    var querySb =
                        new StringBuilder(
                            $"INSERT INTO {Utility.Utility.GetSafeName(table.SchemaName)}.{Utility.Utility.GetSafeName(table.TableName)}(");
                    foreach (var column in table.Columns)
                    {
                        querySb.Append($"{Utility.Utility.GetSafeName(column.ColumnName)},");
                    }

                    querySb.Length--;
                    querySb.Append(") VALUES (");

                    foreach (var column in table.Columns)
                    {
                        if (recordMap.ContainsKey(column.ColumnName))
                        {
                            var rawValue = recordMap[column.ColumnName];
                            if (rawValue == null || string.IsNullOrWhiteSpace(rawValue.ToString()))
                            {
                                querySb.Append($"NULL,");
                            }
                            else
                            {
                                if (column.Serialize)
                                {
                                    rawValue = JsonConvert.SerializeObject(rawValue);
                                }

                                querySb.Append($"'{Utility.Utility.GetSafeString(rawValue.ToString())}',");
                            }
                        }
                        else
                        {
                            querySb.Append($"NULL,");
                        }
                    }

                    querySb.Length--;
                    querySb.Append(");");

                    var query = querySb.ToString();

                    Logger.Debug($"Insert record query: {query}");

                    var cmd = new SqlDatabaseCommand
                    {
                        Connection  = conn,
                        CommandText = query
                    };

                    await cmd.ExecuteNonQueryAsync();
                }
                catch (Exception e)
                {
                    await conn.CloseAsync();

                    Logger.Error(e, $"Error Insert: {e.Message}");
                    throw;
                }
                finally
                {
                    await conn.CloseAsync();
                }
            }
        }
Пример #8
0
        public static async Task UpsertReplicationMetaDataAsync(SqlDatabaseConnection conn, ReplicationTable table, ReplicationMetaData metaData)
        {
            if (await RecordExistsAsync(conn, table, metaData.Request.DataVersions.JobId))
            {
                try
                {
                    // update
                    await conn.OpenAsync();

                    var query = string.Format(UpdateMetaDataQuery,
                                              Utility.Utility.GetSafeName(table.SchemaName),
                                              Utility.Utility.GetSafeName(table.TableName),
                                              JsonConvert.SerializeObject(metaData.Request),
                                              metaData.ReplicatedShapeId,
                                              metaData.ReplicatedShapeName,
                                              metaData.Timestamp,
                                              metaData.Request.DataVersions.JobId
                                              );

                    var cmd = new SqlDatabaseCommand
                    {
                        Connection  = conn,
                        CommandText = query
                    };

                    await cmd.ExecuteNonQueryAsync();
                }
                catch (Exception e)
                {
                    Logger.Error(e, $"Error Update: {e.Message}");
                    throw;
                }
                finally
                {
                    await conn.CloseAsync();
                }
            }
            else
            {
                try
                {
                    // insert
                    await conn.OpenAsync();

                    var query = string.Format(InsertMetaDataQuery,
                                              Utility.Utility.GetSafeName(table.SchemaName),
                                              Utility.Utility.GetSafeName(table.TableName),
                                              metaData.Request.DataVersions.JobId,
                                              JsonConvert.SerializeObject(metaData.Request),
                                              metaData.ReplicatedShapeId,
                                              metaData.ReplicatedShapeName,
                                              metaData.Timestamp
                                              );

                    var cmd = new SqlDatabaseCommand
                    {
                        Connection  = conn,
                        CommandText = query
                    };

                    await cmd.ExecuteNonQueryAsync();
                }
                catch (Exception e)
                {
                    Logger.Error(e, $"Error Insert: {e.Message}");
                    throw;
                }
                finally
                {
                    await conn.CloseAsync();
                }
            }
        }