Example #1
0
        private async Task <Tuple <bool, long> > WriteToRedshiftAsync(FullLoadBatch batch, long ctr)
        {
            if (batch.Records.Any())
            {
                var rowChanges = new List <RowChange>();
                foreach (var record in batch.Records)
                {
                    rowChanges.Add(new RowChange()
                    {
                        ChangeKey  = record.ChangeKey,
                        ChangeType = CdcTools.Redshift.Changes.ChangeType.INSERT,
                        Data       = record.Data,
                        Lsn        = ctr.ToString(),
                        SeqVal     = ctr.ToString()
                    });
                    ctr++;
                }

                try
                {
                    await _redshiftClient.UploadAsCsvAsync(batch.TableSchema.TableName, rowChanges);

                    return(Tuple.Create(true, ctr));
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"{batch.TableSchema.TableName} upload failed. {ex}");
                    return(Tuple.Create(false, ctr));
                }
            }

            return(Tuple.Create(true, ctr));
        }
Example #2
0
        public async Task <FullLoadBatch> GetBatchAsync(TableSchema tableSchema, PrimaryKeyValue lastRetrievedKey, int batchSize)
        {
            var batch = new FullLoadBatch();

            batch.TableSchema = tableSchema;

            using (var conn = await GetOpenConnectionAsync())
            {
                var command = conn.CreateCommand();
                command.CommandText = TableSchemaQueryBuilder.GetExtractQueryUsingAllKeys(tableSchema, batchSize);

                foreach (var pk in tableSchema.PrimaryKeys.OrderBy(x => x.OrdinalPosition))
                {
                    var columnSchema = tableSchema.GetColumn(pk.ColumnName);
                    var value        = lastRetrievedKey.GetValue(pk.OrdinalPosition);
                    command.Parameters.Add(CreateSqlParameter(columnSchema, "@p" + pk.OrdinalPosition, value));
                }

                using (var reader = await command.ExecuteReaderAsync())
                {
                    int ctr = 1;
                    while (await reader.ReadAsync())
                    {
                        var change = new FullLoadRecord();
                        change.ChangeKey  = GetRecordId(reader, tableSchema);
                        change.BatchSeqNo = ctr;

                        foreach (var column in tableSchema.Columns)
                        {
                            change.Data.Add(column.Name, reader[column.Name]);
                        }

                        batch.Records.Add(change);
                        ctr++;
                    }
                }
            }

            if (batch.Records.Any())
            {
                batch.FirstRowKey = GetKey(batch.Records.First(), tableSchema);
                batch.LastRowKey  = GetKey(batch.Records.Last(), tableSchema);
            }

            return(batch);
        }
Example #3
0
        public async Task <FullLoadBatch> GetFirstBatchAsync(TableSchema tableSchema, int batchSize)
        {
            var batch = new FullLoadBatch();

            batch.TableSchema = tableSchema;

            using (var conn = await GetOpenConnectionAsync())
            {
                var command = conn.CreateCommand();
                command.CommandText = $"SELECT TOP {batchSize} * FROM {tableSchema.Schema}.{tableSchema.TableName} ORDER BY {tableSchema.GetOrderedPrimaryKeyColumns()};";

                using (var reader = await command.ExecuteReaderAsync())
                {
                    int ctr = 1;
                    while (await reader.ReadAsync())
                    {
                        var change = new FullLoadRecord();
                        change.ChangeKey  = GetRecordId(reader, tableSchema);
                        change.BatchSeqNo = ctr;

                        foreach (var column in tableSchema.Columns)
                        {
                            change.Data.Add(column.Name, reader[column.Name]);
                        }

                        batch.Records.Add(change);
                        ctr++;
                    }
                }
            }

            if (batch.Records.Any())
            {
                batch.FirstRowKey = GetKey(batch.Records.First(), tableSchema);
                batch.LastRowKey  = GetKey(batch.Records.Last(), tableSchema);
            }

            return(batch);
        }
Example #4
0
        private async Task <long> PublishAsync(IKafkaProducer producer, CancellationToken token, FullLoadBatch batch, long ctr)
        {
            foreach (var row in batch.Records)
            {
                var change = new ChangeRecord();
                change.ChangeKey  = row.ChangeKey;
                change.ChangeType = ChangeType.INSERT;
                change.LsnStr     = ctr.ToString();
                change.SeqValStr  = ctr.ToString();
                change.Data       = row.Data;

                await producer.SendAsync(token, change);

                ctr++;
            }

            return(ctr);
        }