package main import ( "context" "database/sql" "math/rand" "time" log "github.com/sirupsen/logrus" ) func seedPuertos(ctx context.Context, db *sql.DB) { rowsChan := make(chan []UnknownRowValues, queueSize) // Column names for PUERTO table (excluding ID_PUERTO which is IDENTITY) colNames := []string{ "ID_EQUIPO", "ID_TERMINAL", "ID_TIPO_EQUIPO", "ID_PROYECTO_RESERVA", "ID_TIPO_PUERTO", "NUMERO", "CODIGO", "ESTADO", "FECHA_ALTA", "FECHA_ACT", "ID_SITE_HOLDER", "ID_PROYECTO_RESERVA_INICIAL", "ID_DIRECCION", "ID_TIPO_PUERTO_MEMORY", } // Start the data generator goroutine go generatePuertoRows(ctx, totalRows, chunkSize, rowsChan) // Load rows into MSSQL job := MigrationJob{ Schema: "Red", Table: "PUERTO", } if err := loadRowsMssql(ctx, job, colNames, db, rowsChan); err != nil { log.Fatal("Error loading PUERTO rows: ", err) } log.Info("PUERTO data generation and loading completed successfully") } // generatePuertoRows creates random row data for the PUERTO table and sends it through a channel func generatePuertoRows( ctx context.Context, totalRows int, chunkSize int, out chan<- []UnknownRowValues, ) { defer close(out) rand.Seed(time.Now().UnixNano()) rowsGenerated := 0 currentChunk := make([]UnknownRowValues, 0, chunkSize) for i := 0; i < totalRows; i++ { row := generatePuertoRow() currentChunk = append(currentChunk, row) rowsGenerated++ // Send chunk when it reaches the desired size if len(currentChunk) == chunkSize { select { case out <- currentChunk: log.Debugf("Sent PUERTO chunk with %d rows", len(currentChunk)) case <-ctx.Done(): log.Info("Context cancelled, stopping PUERTO row generation") return } currentChunk = make([]UnknownRowValues, 0, chunkSize) } if rowsGenerated%100_000 == 0 { logPuertoSampleRow(rowsGenerated, row) } } // Send remaining rows if len(currentChunk) > 0 { select { case out <- currentChunk: log.Debugf("Sent final PUERTO chunk with %d rows", len(currentChunk)) case <-ctx.Done(): log.Info("Context cancelled, stopping PUERTO row generation") } } log.Infof("Finished generating %d PUERTO rows", rowsGenerated) } // generatePuertoRow creates a single random row for the PUERTO table func generatePuertoRow() UnknownRowValues { dateLowerLimit, _ := time.Parse(time.RFC3339, "2020-12-31T23:59:59Z") dateUpperLimit, _ := time.Parse(time.RFC3339, "2025-12-31T23:59:59Z") // Required columns idEquipo := rand.Intn(10000) + 1 // ID_EQUIPO (1-10000) idTipoEquipo := rand.Intn(100) + 1 // ID_TIPO_EQUIPO (1-100) idTipoPuerto := rand.Intn(50) + 1 // ID_TIPO_PUERTO (1-50) numero := rand.Intn(1000) + 1 // NUMERO (1-1000) codigo := generateRandomString(100) // CODIGO: Random alphanumeric (up to 100 chars) // Optional columns - randomly decide whether to include NULL or a value var idTerminal any if rand.Intn(2) == 0 { idTerminal = rand.Intn(5000) + 1 } else { idTerminal = nil } var idProyectoReserva any if rand.Intn(2) == 0 { idProyectoReserva = rand.Intn(1000) + 1 } else { idProyectoReserva = nil } var estado any if rand.Intn(2) == 0 { estados := []string{"ACTIVO", "LIBRE", "DISPONIBLE", "MANTENIMIENTO", "RESERVADO"} estado = estados[rand.Intn(len(estados))] } else { estado = nil } var fechaAlta any if rand.Intn(2) == 0 { fechaAlta = generateRandomTimestamp(dateLowerLimit, dateUpperLimit) } else { fechaAlta = nil } var fechaAct any if rand.Intn(2) == 0 { fechaAct = generateRandomTimestamp(dateLowerLimit, dateUpperLimit) } else { fechaAct = nil } var idSiteHolder any if rand.Intn(2) == 0 { idSiteHolder = rand.Intn(500) + 1 } else { idSiteHolder = nil } var idProyectoReservaInicial any if rand.Intn(2) == 0 { idProyectoReservaInicial = rand.Intn(1000) + 1 } else { idProyectoReservaInicial = nil } var idDireccion any if rand.Intn(2) == 0 { idDireccion = rand.Intn(100) + 1 } else { idDireccion = nil } var idTipoPuertoMemory any if rand.Intn(2) == 0 { idTipoPuertoMemory = rand.Intn(50) + 1 } else { idTipoPuertoMemory = nil } return UnknownRowValues{ idEquipo, idTerminal, idTipoEquipo, idProyectoReserva, idTipoPuerto, numero, codigo, estado, fechaAlta, fechaAct, idSiteHolder, idProyectoReservaInicial, idDireccion, idTipoPuertoMemory, } } func logPuertoSampleRow(id int, rowValues UnknownRowValues) { log.Infof(` Sample row #%d: ID_EQUIPO (%T): %v ID_TERMINAL (%T): %v ID_TIPO_EQUIPO (%T): %v ID_PROYECTO_RESERVA (%T): %v ID_TIPO_PUERTO (%T): %v NUMERO (%T): %v CODIGO (%T): %v ESTADO (%T): %v FECHA_ALTA (%T): %v FECHA_ACT (%T): %v ID_SITE_HOLDER (%T): %v ID_PROYECTO_RESERVA_INICIAL (%T): %v ID_DIRECCION (%T): %v ID_TIPO_PUERTO_MEMORY (%T): %v `, id, rowValues[0], rowValues[0], rowValues[1], rowValues[1], rowValues[2], rowValues[2], rowValues[3], rowValues[3], rowValues[4], rowValues[4], rowValues[5], rowValues[5], rowValues[6], rowValues[6], rowValues[7], rowValues[7], rowValues[8], rowValues[8], rowValues[9], rowValues[9], rowValues[10], rowValues[10], rowValues[11], rowValues[11], rowValues[12], rowValues[12], rowValues[13], rowValues[13], ) }