82 lines
1.7 KiB
Go
82 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"fmt"
|
|
"math/rand"
|
|
"time"
|
|
|
|
"git.ksdemosapps.com/kylesoda/go-migrate/internal/app/config"
|
|
"github.com/twpayne/go-geom"
|
|
"github.com/twpayne/go-geom/encoding/wkb"
|
|
)
|
|
|
|
func connectToSqlServer() (*sql.DB, error) {
|
|
db, err := sql.Open("sqlserver", config.App.SourceDbUrl)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Unable to connect to sqlserver: %w", err)
|
|
}
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
|
|
defer cancel()
|
|
|
|
if err := db.PingContext(ctx); err != nil {
|
|
return nil, fmt.Errorf("Unable to ping sqlserver: %w", err)
|
|
}
|
|
|
|
return db, nil
|
|
}
|
|
|
|
func Map[T any, V any](input []T, mapper func(T) V) []V {
|
|
result := make([]V, len(input))
|
|
|
|
for i, v := range input {
|
|
result[i] = mapper(v)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
func generateRandomPolygonWKB() []byte {
|
|
minX := rand.Float64()*180 - 90
|
|
minY := rand.Float64()*180 - 90
|
|
|
|
size := 0.01
|
|
|
|
coords := []geom.Coord{
|
|
{minX, minY},
|
|
{minX + size, minY},
|
|
{minX + size, minY + size},
|
|
{minX, minY + size},
|
|
{minX, minY},
|
|
}
|
|
|
|
polygon := geom.NewPolygon(geom.XY).MustSetCoords([][]geom.Coord{coords})
|
|
|
|
polygonWkb, _ := wkb.Marshal(polygon, wkb.NDR)
|
|
|
|
return polygonWkb
|
|
}
|
|
|
|
func generateRandomTimestamp(min, max time.Time) time.Time {
|
|
minUnix := min.Unix()
|
|
maxUnix := max.Unix()
|
|
|
|
delta := maxUnix - minUnix
|
|
secAleatorios := rand.Int63n(delta)
|
|
|
|
return time.Unix(minUnix+secAleatorios, 0)
|
|
}
|
|
|
|
func generateRandomString(maxLength int) string {
|
|
const charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
|
length := min(rand.Intn(maxLength)+1, maxLength)
|
|
|
|
b := make([]byte, length)
|
|
for i := range b {
|
|
b[i] = charset[rand.Intn(len(charset))]
|
|
}
|
|
return string(b)
|
|
}
|