package main import ( "context" "database/sql" "github.com/jackc/pgx/v5/pgxpool" _ "github.com/microsoft/go-mssqldb" log "github.com/sirupsen/logrus" ) type UnknownRowValues = []any func extractFromMssql(ctx context.Context, job MigrationJob, columns []ColumnType, chunkSize int, db *sql.DB, out chan<- []UnknownRowValues) error { query := buildExtractQueryMssql(job, columns) log.Debug("Query used to extract data from mssql: ", query) rows, err := db.QueryContext(ctx, query) if err != nil { return err } defer rows.Close() rowsChunk := make([]UnknownRowValues, 0, chunkSize) for rows.Next() { values := make([]any, len(columns)) scanArgs := make([]any, len(columns)) for i := range values { scanArgs[i] = &values[i] } if err := rows.Scan(scanArgs...); err != nil { return err } rowsChunk = append(rowsChunk, values) if len(rowsChunk) >= chunkSize { out <- rowsChunk rowsChunk = make([]UnknownRowValues, 0, chunkSize) log.Debugf("Chunk send... %+v", job) } } if len(rowsChunk) > 0 { out <- rowsChunk log.Debugf("Chunk send... %+v", job) } return nil } func extractFromPostgres(ctx context.Context, job MigrationJob, columns []ColumnType, chunkSize int, db *pgxpool.Pool, out chan<- []UnknownRowValues) error { query := buildExtractQueryPostgres(job, columns) log.Debug("Query used to extract data from postgres: ", query) rows, err := db.Query(ctx, query) if err != nil { return err } defer rows.Close() rowsChunk := make([]UnknownRowValues, 0, chunkSize) for rows.Next() { values, err := rows.Values() if err != nil { return err } rowsChunk = append(rowsChunk, values) if len(rowsChunk) >= chunkSize { out <- rowsChunk rowsChunk = make([]UnknownRowValues, 0, chunkSize) log.Infof("Chunk send... %+v", job) } } if len(rowsChunk) > 0 { out <- rowsChunk log.Infof("Chunk send... %+v", job) } return nil }