package main import ( "time" log "github.com/sirupsen/logrus" ) func transformRowsMssql( columns []ColumnType, chChunksIn <-chan []UnknownRowValues, chChunksOut chan<- []UnknownRowValues, chJobErrorsOut chan<- JobError, ) { chunkCount := 0 totalRowsTransformed := 0 for rows := range chChunksIn { chunkStartTime := time.Now() log.Debugf("Chunk received, transforming %d rows...", len(rows)) for _, rowValues := range rows { for i, col := range columns { value := rowValues[i] switch col.SystemType() { case "uniqueidentifier": if b, ok := value.([]byte); ok { pgUuid, err := mssqlUuidToBigEndian(b) if err != nil { jobError := JobError{ ShouldCancelJob: true, Prev: err, } chJobErrorsOut <- jobError return } rowValues[i] = pgUuid } case "geometry", "geography": if b, ok := value.([]byte); ok { ewkb, err := wkbToEwkbWithSrid(b, 4326) if err != nil { jobError := JobError{ ShouldCancelJob: true, Prev: err, } chJobErrorsOut <- jobError return } rowValues[i] = ewkb } case "datetime", "datetime2": if t, ok := value.(time.Time); ok { rowValues[i] = ensureUTC(t) } } } } chunkCount++ totalRowsTransformed += len(rows) chunkDuration := time.Since(chunkStartTime) rowsPerSec := float64(len(rows)) / chunkDuration.Seconds() log.Infof("Transformed chunk: %d rows in %v (%.0f rows/sec) - Total: %d rows", len(rows), chunkDuration, rowsPerSec, totalRowsTransformed) chChunksOut <- rows } }