From 07c07cd1949061915a640dbd90b402073832a631 Mon Sep 17 00:00:00 2001 From: Alexandre Vezina Date: Wed, 28 Feb 2024 17:15:12 -0500 Subject: [PATCH 01/13] Implemented turso database --- Makefile | 2 +- go.mod | 8 +++++++- go.sum | 11 +++++++++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 8e23a43c7..3b2e2fb5d 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ SOURCE ?= file go_bindata github github_ee bitbucket aws_s3 google_cloud_storage godoc_vfs gitlab -DATABASE ?= postgres mysql redshift cassandra spanner cockroachdb yugabytedb clickhouse mongodb sqlserver firebird neo4j pgx pgx5 rqlite +DATABASE ?= postgres mysql redshift cassandra spanner cockroachdb yugabytedb clickhouse mongodb sqlserver firebird neo4j pgx pgx5 rqlite turso DATABASE_TEST ?= $(DATABASE) sqlite sqlite3 sqlcipher VERSION ?= $(shell git describe --tags 2>/dev/null | cut -c 2-) TEST_FLAGS ?= diff --git a/go.mod b/go.mod index b5678692c..19399da91 100644 --- a/go.mod +++ b/go.mod @@ -25,6 +25,7 @@ require ( github.com/jackc/pgx/v5 v5.3.1 github.com/ktrysmt/go-bitbucket v0.6.4 github.com/lib/pq v1.10.9 + github.com/libsql/go-libsql v0.0.0-20240219083324-cbcdf96c10a5 github.com/markbates/pkger v0.15.1 github.com/mattn/go-sqlite3 v1.14.16 github.com/microsoft/go-mssqldb v1.0.0 @@ -43,6 +44,11 @@ require ( modernc.org/sqlite v1.18.1 ) +require ( + github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 // indirect + github.com/libsql/sqlite-antlr4-parser v0.0.0-20230802215326-5cb5bb604475 // indirect +) + require ( cloud.google.com/go v0.110.10 // indirect cloud.google.com/go/compute v1.23.3 // indirect @@ -157,7 +163,7 @@ require ( golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0 // indirect golang.org/x/mod v0.11.0 // indirect golang.org/x/net v0.18.0 // indirect - golang.org/x/sync v0.5.0 // indirect + golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect diff --git a/go.sum b/go.sum index f5d80e340..0c2746b23 100644 --- a/go.sum +++ b/go.sum @@ -72,6 +72,8 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 h1:goHVqTbFX3AIo0tzGr14pgfAW2ZfPChKO21Z9MGf/gk= +github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= github.com/apache/arrow/go/v10 v10.0.1 h1:n9dERvixoC/1JjDmBcs9FPaEryoANa2sCgVFo6ez9cI= github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= github.com/apache/thrift v0.16.0 h1:qEy6UW60iVOlUy+b9ZR0d5WzUWYGOo4HfopoyBaNmoY= @@ -435,6 +437,10 @@ github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/libsql/go-libsql v0.0.0-20240219083324-cbcdf96c10a5 h1:F5Ey920pCtHv24YbIU26HRBXdR762wFOm+QRwxOcCVs= +github.com/libsql/go-libsql v0.0.0-20240219083324-cbcdf96c10a5/go.mod h1:XQ+tleHEFQoURJ8LJwmRmmFD9D2eqlv5TpwCFpnN9VM= +github.com/libsql/sqlite-antlr4-parser v0.0.0-20230802215326-5cb5bb604475 h1:6PfEMwfInASh9hkN83aR0j4W/eKaAZt/AURtXAXlas0= +github.com/libsql/sqlite-antlr4-parser v0.0.0-20230802215326-5cb5bb604475/go.mod h1:20nXSmcf0nAscrzqsXeC2/tA3KkV2eCiJqYuyAgl+ss= github.com/markbates/pkger v0.15.1 h1:3MPelV53RnGSW07izx5xGxl4e/sdRD6zqseIk0rMASY= github.com/markbates/pkger v0.15.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -698,8 +704,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180224232135-f6cff0780e54/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -910,6 +916,7 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/postgres v1.0.8/go.mod h1:4eOzrI1MUfm6ObJU/UcmbXyiHSs8jSwH95G5P5dxcAg= gorm.io/gorm v1.20.12/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.21.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.1.0 h1:rVV8Tcg/8jHUkPUorwjaMTtemIMVXfIPKiOqnhEhakk= gotest.tools/v3 v3.1.0/go.mod h1:fHy7eyTmJFO5bQbUsEGQ1v4m2J3Jz9eWL54TP2/ZuYQ= From 9adabb9e962454b42246cc55fc0d30cc839ac403 Mon Sep 17 00:00:00 2001 From: Alexandre Vezina Date: Wed, 28 Feb 2024 17:18:05 -0500 Subject: [PATCH 02/13] Implemented turso database --- database/turso/README.md | 16 + .../migrations/33_create_table.down.sql | 1 + .../migrations/33_create_table.up.sql | 3 + .../migrations/44_alter_table.down.sql | 1 + .../examples/migrations/44_alter_table.up.sql | 1 + database/turso/turso.go | 275 ++++++++++++++++++ database/turso/turso_test.go | 126 ++++++++ internal/cli/build_turso.go | 8 + 8 files changed, 431 insertions(+) create mode 100644 database/turso/README.md create mode 100644 database/turso/examples/migrations/33_create_table.down.sql create mode 100644 database/turso/examples/migrations/33_create_table.up.sql create mode 100644 database/turso/examples/migrations/44_alter_table.down.sql create mode 100644 database/turso/examples/migrations/44_alter_table.up.sql create mode 100644 database/turso/turso.go create mode 100644 database/turso/turso_test.go create mode 100644 internal/cli/build_turso.go diff --git a/database/turso/README.md b/database/turso/README.md new file mode 100644 index 000000000..6c7ebdaaf --- /dev/null +++ b/database/turso/README.md @@ -0,0 +1,16 @@ +# Turso + +`turso://[DATABASE].turso.io?authToken=[TOKEN]?query` + +Unlike other migrate database drivers, the turso driver will automatically wrap each migration in an implicit transaction by default. Migrations must not contain explicit `BEGIN` or `COMMIT` statements. This behavior may change in a future major release. (See below for a workaround.) + +Refer to [upstream documentation](https://github.com/mattn/go-sqlite3/blob/master/README.md#connection-string) for a complete list of query parameters supported by the sqlite3 database driver. The auxiliary query parameters listed below may be supplied to tailor migrate behavior. All auxiliary query parameters are optional. + +| URL Query | WithInstance Config | Description | +| -------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------ | +| `x-migrations-table` | `MigrationsTable` | Name of the migrations table. Defaults to `schema_migrations`. | +| `x-no-tx-wrap` | `NoTxWrap` | Disable implicit transactions when `true`. Migrations may, and should, contain explicit `BEGIN` and `COMMIT` statements. | + +## Notes + +- Uses the `https://github.com/libsql/go-libsql` libsql db driver (cgo) diff --git a/database/turso/examples/migrations/33_create_table.down.sql b/database/turso/examples/migrations/33_create_table.down.sql new file mode 100644 index 000000000..72d18c554 --- /dev/null +++ b/database/turso/examples/migrations/33_create_table.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS pets; \ No newline at end of file diff --git a/database/turso/examples/migrations/33_create_table.up.sql b/database/turso/examples/migrations/33_create_table.up.sql new file mode 100644 index 000000000..5ad3404d1 --- /dev/null +++ b/database/turso/examples/migrations/33_create_table.up.sql @@ -0,0 +1,3 @@ +CREATE TABLE pets ( + name string +); \ No newline at end of file diff --git a/database/turso/examples/migrations/44_alter_table.down.sql b/database/turso/examples/migrations/44_alter_table.down.sql new file mode 100644 index 000000000..72d18c554 --- /dev/null +++ b/database/turso/examples/migrations/44_alter_table.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS pets; \ No newline at end of file diff --git a/database/turso/examples/migrations/44_alter_table.up.sql b/database/turso/examples/migrations/44_alter_table.up.sql new file mode 100644 index 000000000..f0682fcca --- /dev/null +++ b/database/turso/examples/migrations/44_alter_table.up.sql @@ -0,0 +1 @@ +ALTER TABLE pets ADD predator bool; diff --git a/database/turso/turso.go b/database/turso/turso.go new file mode 100644 index 000000000..cb6f7e3a4 --- /dev/null +++ b/database/turso/turso.go @@ -0,0 +1,275 @@ +package turso + +import ( + "database/sql" + "fmt" + "io" + nurl "net/url" + "strconv" + "strings" + "sync/atomic" + + "github.com/golang-migrate/migrate/v4" + "github.com/golang-migrate/migrate/v4/database" + "github.com/hashicorp/go-multierror" + + _ "github.com/libsql/go-libsql" +) + +func init() { + database.Register("turso", &Turso{}) +} + +var DefaultMigrationsTable = "schema_migrations" + +var ( + ErrDatabaseDirty = fmt.Errorf("database is dirty") + ErrNilConfig = fmt.Errorf("no config") + ErrNoDatabaseName = fmt.Errorf("no database name") +) + +type Config struct { + MigrationsTable string + DatabaseName string + NoTxWrap bool +} + +type Turso struct { + db *sql.DB + isLocked atomic.Bool + + config *Config +} + +func (t *Turso) Open(url string) (database.Driver, error) { + purl, err := nurl.Parse(url) + if err != nil { + return nil, err + } + + dbfile := strings.Replace(migrate.FilterCustomQuery(purl).String(), "turso://", "libsql://", 1) + fmt.Println(dbfile) + db, err := sql.Open("libsql", dbfile) + if err != nil { + return nil, err + } + + qv := purl.Query() + + migrationsTable := qv.Get("x-migrations-table") + if len(migrationsTable) == 0 { + migrationsTable = DefaultMigrationsTable + } + + noTxWrap := false + if v := qv.Get("x-no-tx-wrap"); v != "" { + noTxWrap, err = strconv.ParseBool(v) + if err != nil { + return nil, fmt.Errorf("x-no-tx-wrap: %s", err) + } + } + + mx, err := WithInstance(db, &Config{ + DatabaseName: purl.Path, + MigrationsTable: migrationsTable, + NoTxWrap: noTxWrap, + }) + if err != nil { + return nil, err + } + return mx, nil +} + +func WithInstance(instance *sql.DB, config *Config) (database.Driver, error) { + if config == nil { + return nil, ErrNilConfig + } + + if err := instance.Ping(); err != nil { + return nil, err + } + + if len(config.MigrationsTable) == 0 { + config.MigrationsTable = DefaultMigrationsTable + } + + mx := &Turso{ + db: instance, + config: config, + } + if err := mx.ensureVersionTable(); err != nil { + return nil, err + } + return mx, nil +} + +// ensureVersionTable checks if versions table exists and, if not, creates it. +// Note that this function locks the database, which deviates from the usual +// convention of "caller locks" in the Sqlite type. +func (m *Turso) ensureVersionTable() (err error) { + if err = m.Lock(); err != nil { + return err + } + + defer func() { + if e := m.Unlock(); e != nil { + if err == nil { + err = e + } else { + err = multierror.Append(err, e) + } + } + }() + + query := fmt.Sprintf(` + CREATE TABLE IF NOT EXISTS %s (version uint64,dirty bool); + CREATE UNIQUE INDEX IF NOT EXISTS version_unique ON %s (version); + `, m.config.MigrationsTable, m.config.MigrationsTable) + + if _, err := m.db.Exec(query); err != nil { + return err + } + return nil +} + +func (t *Turso) Close() error { + if t.db != nil { + return t.db.Close() + } + return nil +} + +func (t *Turso) Lock() error { + if !t.isLocked.CompareAndSwap(false, true) { + return database.ErrLocked + } + return nil +} + +func (t *Turso) Unlock() error { + if !t.isLocked.CompareAndSwap(true, false) { + return database.ErrNotLocked + } + return nil +} + +func (m *Turso) Run(migration io.Reader) error { + migr, err := io.ReadAll(migration) + if err != nil { + return err + } + query := string(migr[:]) + + if m.config.NoTxWrap { + return m.executeQueryNoTx(query) + } + return m.executeQuery(query) +} + +func (m *Turso) executeQuery(query string) error { + tx, err := m.db.Begin() + if err != nil { + return &database.Error{OrigErr: err, Err: "transaction start failed"} + } + if _, err := tx.Exec(query); err != nil { + if errRollback := tx.Rollback(); errRollback != nil { + err = multierror.Append(err, errRollback) + } + return &database.Error{OrigErr: err, Query: []byte(query)} + } + if err := tx.Commit(); err != nil { + return &database.Error{OrigErr: err, Err: "transaction commit failed"} + } + return nil +} + +func (m *Turso) executeQueryNoTx(query string) error { + if _, err := m.db.Exec(query); err != nil { + return &database.Error{OrigErr: err, Query: []byte(query)} + } + return nil +} + +func (m *Turso) SetVersion(version int, dirty bool) error { + tx, err := m.db.Begin() + if err != nil { + return &database.Error{OrigErr: err, Err: "transaction start failed"} + } + + query := "DELETE FROM " + m.config.MigrationsTable + if _, err := tx.Exec(query); err != nil { + return &database.Error{OrigErr: err, Query: []byte(query)} + } + + // Also re-write the schema version for nil dirty versions to prevent + // empty schema version for failed down migration on the first migration + // See: https://github.com/golang-migrate/migrate/issues/330 + if version >= 0 || (version == database.NilVersion && dirty) { + query := fmt.Sprintf(`INSERT INTO %s (version, dirty) VALUES (?, ?)`, m.config.MigrationsTable) + if _, err := tx.Exec(query, version, dirty); err != nil { + if errRollback := tx.Rollback(); errRollback != nil { + err = multierror.Append(err, errRollback) + } + return &database.Error{OrigErr: err, Query: []byte(query)} + } + } + + if err := tx.Commit(); err != nil { + return &database.Error{OrigErr: err, Err: "transaction commit failed"} + } + + return nil +} + +func (m *Turso) Version() (version int, dirty bool, err error) { + query := "SELECT version, dirty FROM " + m.config.MigrationsTable + " LIMIT 1" + err = m.db.QueryRow(query).Scan(&version, &dirty) + if err != nil { + return database.NilVersion, false, nil + } + return version, dirty, nil +} + +func (m *Turso) Drop() (err error) { + query := `SELECT name FROM sqlite_master WHERE type = 'table';` + tables, err := m.db.Query(query) + if err != nil { + return &database.Error{OrigErr: err, Query: []byte(query)} + } + defer func() { + if errClose := tables.Close(); errClose != nil { + err = multierror.Append(err, errClose) + } + }() + + tableNames := make([]string, 0) + for tables.Next() { + var tableName string + if err := tables.Scan(&tableName); err != nil { + return err + } + if len(tableName) > 0 { + tableNames = append(tableNames, tableName) + } + } + if err := tables.Err(); err != nil { + return &database.Error{OrigErr: err, Query: []byte(query)} + } + + if len(tableNames) > 0 { + for _, t := range tableNames { + query := "DROP TABLE " + t + err = m.executeQuery(query) + if err != nil { + return &database.Error{OrigErr: err, Query: []byte(query)} + } + } + query := "VACUUM" + _, err = m.db.Query(query) + if err != nil { + return &database.Error{OrigErr: err, Query: []byte(query)} + } + } + + return nil +} diff --git a/database/turso/turso_test.go b/database/turso/turso_test.go new file mode 100644 index 000000000..a1f396c6b --- /dev/null +++ b/database/turso/turso_test.go @@ -0,0 +1,126 @@ +package turso + +import ( + "database/sql" + "fmt" + "path/filepath" + "testing" + + "github.com/golang-migrate/migrate/v4" + dt "github.com/golang-migrate/migrate/v4/database/testing" + _ "github.com/golang-migrate/migrate/v4/source/file" + _ "github.com/libsql/go-libsql" + "github.com/stretchr/testify/assert" +) + +func Test(t *testing.T) { + dir := t.TempDir() + dbPath := filepath.Join(dir, "turso.db") + t.Logf("DB path : %s\n", dbPath) + p := &Turso{} + addr := fmt.Sprintf("file://%s", dbPath) + d, err := p.Open(addr) + if err != nil { + t.Fatal(err) + } + dt.Test(t, d, []byte("CREATE TABLE t (Qty int, Name string);")) +} + +func TestMigrate(t *testing.T) { + dir := t.TempDir() + dbPath := filepath.Join("file://", dir, "turso.db") + t.Logf("DB path : %s\n", dbPath) + + db, err := sql.Open("libsql", dbPath) + if err != nil { + t.Errorf("Error opening database: %v", err) + return + } + defer func() { + if err := db.Close(); err != nil { + return + } + }() + driver, err := WithInstance(db, &Config{}) + if err != nil { + t.Fatal(err) + } + + m, err := migrate.NewWithDatabaseInstance( + "file://./examples/migrations", + "ql", driver) + if err != nil { + t.Fatal(err) + } + dt.TestMigrate(t, m) + +} + +func TestMigrationTable(t *testing.T) { + dir := t.TempDir() + dbPath := filepath.Join("file://", dir, "turso.db") + t.Logf("DB path : %s\n", dbPath) + + db, err := sql.Open("libsql", dbPath) + if err != nil { + t.Errorf("Error opening database: %v", err) + return + } + defer func() { + if err := db.Close(); err != nil { + return + } + }() + + config := &Config{ + MigrationsTable: "my_migration_table", + } + driver, err := WithInstance(db, config) + if err != nil { + t.Fatal(err) + } + m, err := migrate.NewWithDatabaseInstance( + "file://./examples/migrations", + "ql", driver) + if err != nil { + t.Fatal(err) + } + t.Log("UP") + err = m.Up() + if err != nil { + t.Fatal(err) + } + + _, err = db.Query(fmt.Sprintf("SELECT * FROM %s", config.MigrationsTable)) + if err != nil { + t.Fatal(err) + } +} + +func TestNoTxWrap(t *testing.T) { + dir := t.TempDir() + dbPath := filepath.Join(dir, "turso.db") + t.Logf("DB path : %s\n", dbPath) + p := &Turso{} + addr := fmt.Sprintf("file://%s?x-no-tx-wrap=true", dbPath) + d, err := p.Open(addr) + if err != nil { + t.Fatal(err) + } + // An explicit BEGIN statement would ordinarily fail without x-no-tx-wrap. + // (Transactions in sqlite may not be nested.) + dt.Test(t, d, []byte("BEGIN; CREATE TABLE t (Qty int, Name string); COMMIT;")) +} + +func TestNoTxWrapInvalidValue(t *testing.T) { + dir := t.TempDir() + dbPath := filepath.Join(dir, "turso.db") + t.Logf("DB path : %s\n", dbPath) + p := &Turso{} + addr := fmt.Sprintf("libsql://%s?x-no-tx-wrap=yeppers", dbPath) + _, err := p.Open(addr) + if assert.Error(t, err) { + assert.Contains(t, err.Error(), "x-no-tx-wrap") + assert.Contains(t, err.Error(), "invalid syntax") + } +} diff --git a/internal/cli/build_turso.go b/internal/cli/build_turso.go new file mode 100644 index 000000000..2e0652921 --- /dev/null +++ b/internal/cli/build_turso.go @@ -0,0 +1,8 @@ +//go:build turso +// +build turso + +package cli + +import ( + _ "github.com/golang-migrate/migrate/v4/database/turso" +) From 2e4694feb696a6dd61f46cb53b353f403e12e461 Mon Sep 17 00:00:00 2001 From: Alexandre Vezina Date: Wed, 28 Feb 2024 17:31:33 -0500 Subject: [PATCH 03/13] Renamed database to libsql --- Makefile | 2 +- database/{turso => libsql}/README.md | 8 +- .../migrations/33_create_table.down.sql | 0 .../migrations/33_create_table.up.sql | 0 .../migrations/44_alter_table.down.sql | 0 .../examples/migrations/44_alter_table.up.sql | 0 database/{turso/turso.go => libsql/libsql.go} | 76 +++++++++---------- .../turso_test.go => libsql/libsql_test.go} | 20 ++--- 8 files changed, 53 insertions(+), 53 deletions(-) rename database/{turso => libsql}/README.md (74%) rename database/{turso => libsql}/examples/migrations/33_create_table.down.sql (100%) rename database/{turso => libsql}/examples/migrations/33_create_table.up.sql (100%) rename database/{turso => libsql}/examples/migrations/44_alter_table.down.sql (100%) rename database/{turso => libsql}/examples/migrations/44_alter_table.up.sql (100%) rename database/{turso/turso.go => libsql/libsql.go} (76%) rename database/{turso/turso_test.go => libsql/libsql_test.go} (88%) diff --git a/Makefile b/Makefile index 3b2e2fb5d..ad1526c53 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ SOURCE ?= file go_bindata github github_ee bitbucket aws_s3 google_cloud_storage godoc_vfs gitlab -DATABASE ?= postgres mysql redshift cassandra spanner cockroachdb yugabytedb clickhouse mongodb sqlserver firebird neo4j pgx pgx5 rqlite turso +DATABASE ?= postgres mysql redshift cassandra spanner cockroachdb yugabytedb clickhouse mongodb sqlserver firebird neo4j pgx pgx5 rqlite libsql DATABASE_TEST ?= $(DATABASE) sqlite sqlite3 sqlcipher VERSION ?= $(shell git describe --tags 2>/dev/null | cut -c 2-) TEST_FLAGS ?= diff --git a/database/turso/README.md b/database/libsql/README.md similarity index 74% rename from database/turso/README.md rename to database/libsql/README.md index 6c7ebdaaf..2fa4d3ac7 100644 --- a/database/turso/README.md +++ b/database/libsql/README.md @@ -1,8 +1,10 @@ -# Turso +# libsql -`turso://[DATABASE].turso.io?authToken=[TOKEN]?query` +To use with Turso -Unlike other migrate database drivers, the turso driver will automatically wrap each migration in an implicit transaction by default. Migrations must not contain explicit `BEGIN` or `COMMIT` statements. This behavior may change in a future major release. (See below for a workaround.) +`libsql://[DATABASE].turso.io?authToken=[TOKEN]&query` + +Unlike other migrate database drivers, the libsql driver will automatically wrap each migration in an implicit transaction by default. Migrations must not contain explicit `BEGIN` or `COMMIT` statements. This behavior may change in a future major release. (See below for a workaround.) Refer to [upstream documentation](https://github.com/mattn/go-sqlite3/blob/master/README.md#connection-string) for a complete list of query parameters supported by the sqlite3 database driver. The auxiliary query parameters listed below may be supplied to tailor migrate behavior. All auxiliary query parameters are optional. diff --git a/database/turso/examples/migrations/33_create_table.down.sql b/database/libsql/examples/migrations/33_create_table.down.sql similarity index 100% rename from database/turso/examples/migrations/33_create_table.down.sql rename to database/libsql/examples/migrations/33_create_table.down.sql diff --git a/database/turso/examples/migrations/33_create_table.up.sql b/database/libsql/examples/migrations/33_create_table.up.sql similarity index 100% rename from database/turso/examples/migrations/33_create_table.up.sql rename to database/libsql/examples/migrations/33_create_table.up.sql diff --git a/database/turso/examples/migrations/44_alter_table.down.sql b/database/libsql/examples/migrations/44_alter_table.down.sql similarity index 100% rename from database/turso/examples/migrations/44_alter_table.down.sql rename to database/libsql/examples/migrations/44_alter_table.down.sql diff --git a/database/turso/examples/migrations/44_alter_table.up.sql b/database/libsql/examples/migrations/44_alter_table.up.sql similarity index 100% rename from database/turso/examples/migrations/44_alter_table.up.sql rename to database/libsql/examples/migrations/44_alter_table.up.sql diff --git a/database/turso/turso.go b/database/libsql/libsql.go similarity index 76% rename from database/turso/turso.go rename to database/libsql/libsql.go index cb6f7e3a4..692b8b311 100644 --- a/database/turso/turso.go +++ b/database/libsql/libsql.go @@ -1,4 +1,4 @@ -package turso +package libsql import ( "database/sql" @@ -6,7 +6,6 @@ import ( "io" nurl "net/url" "strconv" - "strings" "sync/atomic" "github.com/golang-migrate/migrate/v4" @@ -17,7 +16,7 @@ import ( ) func init() { - database.Register("turso", &Turso{}) + database.Register("libsql", &LibSQL{}) } var DefaultMigrationsTable = "schema_migrations" @@ -34,21 +33,20 @@ type Config struct { NoTxWrap bool } -type Turso struct { +type LibSQL struct { db *sql.DB isLocked atomic.Bool config *Config } -func (t *Turso) Open(url string) (database.Driver, error) { +func (d *LibSQL) Open(url string) (database.Driver, error) { purl, err := nurl.Parse(url) if err != nil { return nil, err } - dbfile := strings.Replace(migrate.FilterCustomQuery(purl).String(), "turso://", "libsql://", 1) - fmt.Println(dbfile) + dbfile := migrate.FilterCustomQuery(purl).String() db, err := sql.Open("libsql", dbfile) if err != nil { return nil, err @@ -93,7 +91,7 @@ func WithInstance(instance *sql.DB, config *Config) (database.Driver, error) { config.MigrationsTable = DefaultMigrationsTable } - mx := &Turso{ + mx := &LibSQL{ db: instance, config: config, } @@ -106,13 +104,13 @@ func WithInstance(instance *sql.DB, config *Config) (database.Driver, error) { // ensureVersionTable checks if versions table exists and, if not, creates it. // Note that this function locks the database, which deviates from the usual // convention of "caller locks" in the Sqlite type. -func (m *Turso) ensureVersionTable() (err error) { - if err = m.Lock(); err != nil { +func (d *LibSQL) ensureVersionTable() (err error) { + if err = d.Lock(); err != nil { return err } defer func() { - if e := m.Unlock(); e != nil { + if e := d.Unlock(); e != nil { if err == nil { err = e } else { @@ -124,50 +122,50 @@ func (m *Turso) ensureVersionTable() (err error) { query := fmt.Sprintf(` CREATE TABLE IF NOT EXISTS %s (version uint64,dirty bool); CREATE UNIQUE INDEX IF NOT EXISTS version_unique ON %s (version); - `, m.config.MigrationsTable, m.config.MigrationsTable) + `, d.config.MigrationsTable, d.config.MigrationsTable) - if _, err := m.db.Exec(query); err != nil { + if _, err := d.db.Exec(query); err != nil { return err } return nil } -func (t *Turso) Close() error { - if t.db != nil { - return t.db.Close() +func (d *LibSQL) Close() error { + if d.db != nil { + return d.db.Close() } return nil } -func (t *Turso) Lock() error { - if !t.isLocked.CompareAndSwap(false, true) { +func (d *LibSQL) Lock() error { + if !d.isLocked.CompareAndSwap(false, true) { return database.ErrLocked } return nil } -func (t *Turso) Unlock() error { - if !t.isLocked.CompareAndSwap(true, false) { +func (d *LibSQL) Unlock() error { + if !d.isLocked.CompareAndSwap(true, false) { return database.ErrNotLocked } return nil } -func (m *Turso) Run(migration io.Reader) error { +func (d *LibSQL) Run(migration io.Reader) error { migr, err := io.ReadAll(migration) if err != nil { return err } query := string(migr[:]) - if m.config.NoTxWrap { - return m.executeQueryNoTx(query) + if d.config.NoTxWrap { + return d.executeQueryNoTx(query) } - return m.executeQuery(query) + return d.executeQuery(query) } -func (m *Turso) executeQuery(query string) error { - tx, err := m.db.Begin() +func (d *LibSQL) executeQuery(query string) error { + tx, err := d.db.Begin() if err != nil { return &database.Error{OrigErr: err, Err: "transaction start failed"} } @@ -183,20 +181,20 @@ func (m *Turso) executeQuery(query string) error { return nil } -func (m *Turso) executeQueryNoTx(query string) error { - if _, err := m.db.Exec(query); err != nil { +func (d *LibSQL) executeQueryNoTx(query string) error { + if _, err := d.db.Exec(query); err != nil { return &database.Error{OrigErr: err, Query: []byte(query)} } return nil } -func (m *Turso) SetVersion(version int, dirty bool) error { - tx, err := m.db.Begin() +func (d *LibSQL) SetVersion(version int, dirty bool) error { + tx, err := d.db.Begin() if err != nil { return &database.Error{OrigErr: err, Err: "transaction start failed"} } - query := "DELETE FROM " + m.config.MigrationsTable + query := "DELETE FROM " + d.config.MigrationsTable if _, err := tx.Exec(query); err != nil { return &database.Error{OrigErr: err, Query: []byte(query)} } @@ -205,7 +203,7 @@ func (m *Turso) SetVersion(version int, dirty bool) error { // empty schema version for failed down migration on the first migration // See: https://github.com/golang-migrate/migrate/issues/330 if version >= 0 || (version == database.NilVersion && dirty) { - query := fmt.Sprintf(`INSERT INTO %s (version, dirty) VALUES (?, ?)`, m.config.MigrationsTable) + query := fmt.Sprintf(`INSERT INTO %s (version, dirty) VALUES (?, ?)`, d.config.MigrationsTable) if _, err := tx.Exec(query, version, dirty); err != nil { if errRollback := tx.Rollback(); errRollback != nil { err = multierror.Append(err, errRollback) @@ -221,18 +219,18 @@ func (m *Turso) SetVersion(version int, dirty bool) error { return nil } -func (m *Turso) Version() (version int, dirty bool, err error) { - query := "SELECT version, dirty FROM " + m.config.MigrationsTable + " LIMIT 1" - err = m.db.QueryRow(query).Scan(&version, &dirty) +func (d *LibSQL) Version() (version int, dirty bool, err error) { + query := "SELECT version, dirty FROM " + d.config.MigrationsTable + " LIMIT 1" + err = d.db.QueryRow(query).Scan(&version, &dirty) if err != nil { return database.NilVersion, false, nil } return version, dirty, nil } -func (m *Turso) Drop() (err error) { +func (d *LibSQL) Drop() (err error) { query := `SELECT name FROM sqlite_master WHERE type = 'table';` - tables, err := m.db.Query(query) + tables, err := d.db.Query(query) if err != nil { return &database.Error{OrigErr: err, Query: []byte(query)} } @@ -259,13 +257,13 @@ func (m *Turso) Drop() (err error) { if len(tableNames) > 0 { for _, t := range tableNames { query := "DROP TABLE " + t - err = m.executeQuery(query) + err = d.executeQuery(query) if err != nil { return &database.Error{OrigErr: err, Query: []byte(query)} } } query := "VACUUM" - _, err = m.db.Query(query) + _, err = d.db.Query(query) if err != nil { return &database.Error{OrigErr: err, Query: []byte(query)} } diff --git a/database/turso/turso_test.go b/database/libsql/libsql_test.go similarity index 88% rename from database/turso/turso_test.go rename to database/libsql/libsql_test.go index a1f396c6b..f30df7faa 100644 --- a/database/turso/turso_test.go +++ b/database/libsql/libsql_test.go @@ -1,4 +1,4 @@ -package turso +package libsql import ( "database/sql" @@ -9,15 +9,15 @@ import ( "github.com/golang-migrate/migrate/v4" dt "github.com/golang-migrate/migrate/v4/database/testing" _ "github.com/golang-migrate/migrate/v4/source/file" - _ "github.com/libsql/go-libsql" + "github.com/stretchr/testify/assert" ) func Test(t *testing.T) { dir := t.TempDir() - dbPath := filepath.Join(dir, "turso.db") + dbPath := filepath.Join(dir, "libsql.db") t.Logf("DB path : %s\n", dbPath) - p := &Turso{} + p := &LibSQL{} addr := fmt.Sprintf("file://%s", dbPath) d, err := p.Open(addr) if err != nil { @@ -28,7 +28,7 @@ func Test(t *testing.T) { func TestMigrate(t *testing.T) { dir := t.TempDir() - dbPath := filepath.Join("file://", dir, "turso.db") + dbPath := filepath.Join("file://", dir, "libsql.db") t.Logf("DB path : %s\n", dbPath) db, err := sql.Open("libsql", dbPath) @@ -58,7 +58,7 @@ func TestMigrate(t *testing.T) { func TestMigrationTable(t *testing.T) { dir := t.TempDir() - dbPath := filepath.Join("file://", dir, "turso.db") + dbPath := filepath.Join("file://", dir, "libsql.db") t.Logf("DB path : %s\n", dbPath) db, err := sql.Open("libsql", dbPath) @@ -99,9 +99,9 @@ func TestMigrationTable(t *testing.T) { func TestNoTxWrap(t *testing.T) { dir := t.TempDir() - dbPath := filepath.Join(dir, "turso.db") + dbPath := filepath.Join(dir, "libsql.db") t.Logf("DB path : %s\n", dbPath) - p := &Turso{} + p := &LibSQL{} addr := fmt.Sprintf("file://%s?x-no-tx-wrap=true", dbPath) d, err := p.Open(addr) if err != nil { @@ -114,9 +114,9 @@ func TestNoTxWrap(t *testing.T) { func TestNoTxWrapInvalidValue(t *testing.T) { dir := t.TempDir() - dbPath := filepath.Join(dir, "turso.db") + dbPath := filepath.Join(dir, "libsql.db") t.Logf("DB path : %s\n", dbPath) - p := &Turso{} + p := &LibSQL{} addr := fmt.Sprintf("libsql://%s?x-no-tx-wrap=yeppers", dbPath) _, err := p.Open(addr) if assert.Error(t, err) { From 75aa116e9d8f4d7a79d7fee9117dbfc8964fb922 Mon Sep 17 00:00:00 2001 From: Alexandre Vezina Date: Wed, 28 Feb 2024 17:39:07 -0500 Subject: [PATCH 04/13] Renamed internal/cli to libsql --- internal/cli/build_turso.go | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 internal/cli/build_turso.go diff --git a/internal/cli/build_turso.go b/internal/cli/build_turso.go deleted file mode 100644 index 2e0652921..000000000 --- a/internal/cli/build_turso.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build turso -// +build turso - -package cli - -import ( - _ "github.com/golang-migrate/migrate/v4/database/turso" -) From f82c5c0d40195dc63c1639ac57533987ea051199 Mon Sep 17 00:00:00 2001 From: Alexandre Vezina Date: Wed, 28 Feb 2024 18:21:36 -0500 Subject: [PATCH 05/13] Renamed internal/cli to libsql --- internal/cli/build_libsql.go | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 internal/cli/build_libsql.go diff --git a/internal/cli/build_libsql.go b/internal/cli/build_libsql.go new file mode 100644 index 000000000..d54aed95f --- /dev/null +++ b/internal/cli/build_libsql.go @@ -0,0 +1,8 @@ +//go:build turso +// +build turso + +package cli + +import ( + _ "github.com/golang-migrate/migrate/v4/database/libsql" +) From 0c4e47eebabbab07bc3aa4f0ad3c50eed84b9236 Mon Sep 17 00:00:00 2001 From: Alexandre Vezina Date: Wed, 28 Feb 2024 23:59:09 -0500 Subject: [PATCH 06/13] Bugfixes * Fixed tags in internal/cli/build_libsql.g Fixed import not connecting to remote --- database/libsql/libsql.go | 5 ++-- database/libsql/libsql_test.go | 5 ++-- go.mod | 7 +++-- go.sum | 51 ++++++++++++++++++++++++++++++---- internal/cli/build_libsql.go | 4 +-- 5 files changed, 57 insertions(+), 15 deletions(-) diff --git a/database/libsql/libsql.go b/database/libsql/libsql.go index 692b8b311..0345adfa5 100644 --- a/database/libsql/libsql.go +++ b/database/libsql/libsql.go @@ -6,13 +6,14 @@ import ( "io" nurl "net/url" "strconv" + "strings" "sync/atomic" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database" "github.com/hashicorp/go-multierror" - _ "github.com/libsql/go-libsql" + _ "github.com/tursodatabase/libsql-client-go/libsql" ) func init() { @@ -46,7 +47,7 @@ func (d *LibSQL) Open(url string) (database.Driver, error) { return nil, err } - dbfile := migrate.FilterCustomQuery(purl).String() + dbfile := strings.Replace(migrate.FilterCustomQuery(purl).String(), "libsql://", "", 1) db, err := sql.Open("libsql", dbfile) if err != nil { return nil, err diff --git a/database/libsql/libsql_test.go b/database/libsql/libsql_test.go index f30df7faa..7406da2c6 100644 --- a/database/libsql/libsql_test.go +++ b/database/libsql/libsql_test.go @@ -9,6 +9,7 @@ import ( "github.com/golang-migrate/migrate/v4" dt "github.com/golang-migrate/migrate/v4/database/testing" _ "github.com/golang-migrate/migrate/v4/source/file" + _ "modernc.org/sqlite" "github.com/stretchr/testify/assert" ) @@ -18,7 +19,7 @@ func Test(t *testing.T) { dbPath := filepath.Join(dir, "libsql.db") t.Logf("DB path : %s\n", dbPath) p := &LibSQL{} - addr := fmt.Sprintf("file://%s", dbPath) + addr := fmt.Sprintf("file:%s", dbPath) d, err := p.Open(addr) if err != nil { t.Fatal(err) @@ -28,7 +29,7 @@ func Test(t *testing.T) { func TestMigrate(t *testing.T) { dir := t.TempDir() - dbPath := filepath.Join("file://", dir, "libsql.db") + dbPath := filepath.Join("file:", dir, "libsql.db") t.Logf("DB path : %s\n", dbPath) db, err := sql.Open("libsql", dbPath) diff --git a/go.mod b/go.mod index 19399da91..3cb2c5d33 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,6 @@ require ( github.com/jackc/pgx/v5 v5.3.1 github.com/ktrysmt/go-bitbucket v0.6.4 github.com/lib/pq v1.10.9 - github.com/libsql/go-libsql v0.0.0-20240219083324-cbcdf96c10a5 github.com/markbates/pkger v0.15.1 github.com/mattn/go-sqlite3 v1.14.16 github.com/microsoft/go-mssqldb v1.0.0 @@ -34,6 +33,7 @@ require ( github.com/neo4j/neo4j-go-driver v1.8.1-0.20200803113522-b626aa943eba github.com/snowflakedb/gosnowflake v1.6.19 github.com/stretchr/testify v1.8.3 + github.com/tursodatabase/libsql-client-go v0.0.0-20240220085343-4ae0eb9d0898 github.com/xanzy/go-gitlab v0.15.0 go.mongodb.org/mongo-driver v1.7.5 go.uber.org/atomic v1.7.0 @@ -47,6 +47,7 @@ require ( require ( github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 // indirect github.com/libsql/sqlite-antlr4-parser v0.0.0-20230802215326-5cb5bb604475 // indirect + nhooyr.io/websocket v1.8.7 // indirect ) require ( @@ -130,10 +131,10 @@ require ( github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/klauspost/asmfmt v1.3.2 // indirect - github.com/klauspost/compress v1.15.11 // indirect + github.com/klauspost/compress v1.15.15 // indirect github.com/klauspost/cpuid/v2 v2.0.9 // indirect github.com/mattn/go-colorable v0.1.6 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect + github.com/mattn/go-isatty v0.0.18 // indirect github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // indirect github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect github.com/mitchellh/mapstructure v1.1.2 // indirect diff --git a/go.sum b/go.sum index 0c2746b23..5ad692eb0 100644 --- a/go.sum +++ b/go.sum @@ -194,10 +194,21 @@ github.com/fsouza/fake-gcs-server v1.17.0 h1:OeH75kBZcZa3ZE+zz/mFdJ2btt9FgqfjI7g github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw= github.com/gabriel-vasile/mimetype v1.4.1 h1:TRWk7se+TOjCYgRth7+1/OYLNiRNIotknkFtf/dnN7Q= github.com/gabriel-vasile/mimetype v1.4.1/go.mod h1:05Vi0w3Y9c/lNvJOdmIwvrrAhX3rYhfQQCaf9VJcv7M= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -206,6 +217,12 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gobuffalo/here v0.6.0 h1:hYrd0a6gDmWxBM4TnrGw8mQg24iSVoIkHEk7FodQcBI= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gocql/gocql v0.0.0-20210515062232-b7ef815b4556 h1:N/MD/sr6o61X+iZBAT2qEUF023s4KbA8RWfKzl0L6MQ= @@ -239,6 +256,8 @@ github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -275,6 +294,7 @@ github.com/google/go-github/v39 v39.2.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= @@ -301,6 +321,8 @@ github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= @@ -395,6 +417,8 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= @@ -409,9 +433,10 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.11 h1:Lcadnb3RKGin4FYM/orgq0qde+nc15E5Cbqg4B9Sx9c= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= +github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -428,6 +453,8 @@ github.com/ktrysmt/go-bitbucket v0.6.4 h1:C8dUGp0qkwncKtAnozHCbbqhptefzEd1I0sfnu github.com/ktrysmt/go-bitbucket v0.6.4/go.mod h1:9u0v3hsd2rqCHRIpbir1oP7F58uo5dq19sBYvuMoyQ4= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -437,8 +464,6 @@ github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/libsql/go-libsql v0.0.0-20240219083324-cbcdf96c10a5 h1:F5Ey920pCtHv24YbIU26HRBXdR762wFOm+QRwxOcCVs= -github.com/libsql/go-libsql v0.0.0-20240219083324-cbcdf96c10a5/go.mod h1:XQ+tleHEFQoURJ8LJwmRmmFD9D2eqlv5TpwCFpnN9VM= github.com/libsql/sqlite-antlr4-parser v0.0.0-20230802215326-5cb5bb604475 h1:6PfEMwfInASh9hkN83aR0j4W/eKaAZt/AURtXAXlas0= github.com/libsql/sqlite-antlr4-parser v0.0.0-20230802215326-5cb5bb604475/go.mod h1:20nXSmcf0nAscrzqsXeC2/tA3KkV2eCiJqYuyAgl+ss= github.com/markbates/pkger v0.15.1 h1:3MPelV53RnGSW07izx5xGxl4e/sdRD6zqseIk0rMASY= @@ -454,8 +479,9 @@ github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= +github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= @@ -472,6 +498,10 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= @@ -558,6 +588,12 @@ github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gt github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tursodatabase/libsql-client-go v0.0.0-20240220085343-4ae0eb9d0898 h1:1MvEhzI5pvP27e9Dzz861mxk9WzXZLSJwzOU67cKTbU= +github.com/tursodatabase/libsql-client-go v0.0.0-20240220085343-4ae0eb9d0898/go.mod h1:9bKuHS7eZh/0mJndbUOrCx8Ej3PlsRDszj4L7oVYMPQ= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/xanzy/go-gitlab v0.15.0 h1:rWtwKTgEnXyNUGrOArN7yyc3THRkpYcKXIXia9abywQ= github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= @@ -749,6 +785,7 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= @@ -777,6 +814,7 @@ golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -916,7 +954,6 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/postgres v1.0.8/go.mod h1:4eOzrI1MUfm6ObJU/UcmbXyiHSs8jSwH95G5P5dxcAg= gorm.io/gorm v1.20.12/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.21.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.1.0 h1:rVV8Tcg/8jHUkPUorwjaMTtemIMVXfIPKiOqnhEhakk= gotest.tools/v3 v3.1.0/go.mod h1:fHy7eyTmJFO5bQbUsEGQ1v4m2J3Jz9eWL54TP2/ZuYQ= @@ -980,6 +1017,8 @@ modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.5.1 h1:RTNHdsrOpeoSeOF4FbzTo8gBYByaJ5xT7NgZ9ZqRiJM= modernc.org/zappy v1.0.0 h1:dPVaP+3ueIUv4guk8PuZ2wiUGcJ1WUVvIheeSSTD0yk= modernc.org/zappy v1.0.0/go.mod h1:hHe+oGahLVII/aTTyWK/b53VDHMAGCBYYeZ9sn83HC4= +nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/internal/cli/build_libsql.go b/internal/cli/build_libsql.go index d54aed95f..6f4d0014f 100644 --- a/internal/cli/build_libsql.go +++ b/internal/cli/build_libsql.go @@ -1,5 +1,5 @@ -//go:build turso -// +build turso +//go:build libsql +// +build libsql package cli From 5a040714728930f09db05615f54a3c1c8a719f62 Mon Sep 17 00:00:00 2001 From: Alexandre Vezina Date: Thu, 29 Feb 2024 00:02:17 -0500 Subject: [PATCH 07/13] Updated README --- README.md | 113 +++++++++++++++++++++++++++--------------------------- 1 file changed, 57 insertions(+), 56 deletions(-) diff --git a/README.md b/README.md index ad1c73dc7..6a10e5cb4 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,13 @@ # migrate -__Database migrations written in Go. Use as [CLI](#cli-usage) or import as [library](#use-in-your-go-project).__ +**Database migrations written in Go. Use as [CLI](#cli-usage) or import as [library](#use-in-your-go-project).** -* Migrate reads migrations from [sources](#migration-sources) - and applies them in correct order to a [database](#databases). -* Drivers are "dumb", migrate glues everything together and makes sure the logic is bulletproof. - (Keeps the drivers lightweight, too.) -* Database drivers don't assume things or try to correct user input. When in doubt, fail. +- Migrate reads migrations from [sources](#migration-sources) + and applies them in correct order to a [database](#databases). +- Drivers are "dumb", migrate glues everything together and makes sure the logic is bulletproof. + (Keeps the drivers lightweight, too.) +- Database drivers don't assume things or try to correct user input. When in doubt, fail. Forked from [mattes/migrate](https://github.com/mattes/migrate) @@ -23,27 +23,28 @@ Forked from [mattes/migrate](https://github.com/mattes/migrate) Database drivers run migrations. [Add a new database?](database/driver.go) -* [PostgreSQL](database/postgres) -* [PGX v4](database/pgx) -* [PGX v5](database/pgx/v5) -* [Redshift](database/redshift) -* [Ql](database/ql) -* [Cassandra / ScyllaDB](database/cassandra) -* [SQLite](database/sqlite) -* [SQLite3](database/sqlite3) ([todo #165](https://github.com/mattes/migrate/issues/165)) -* [SQLCipher](database/sqlcipher) -* [MySQL / MariaDB](database/mysql) -* [Neo4j](database/neo4j) -* [MongoDB](database/mongodb) -* [CrateDB](database/crate) ([todo #170](https://github.com/mattes/migrate/issues/170)) -* [Shell](database/shell) ([todo #171](https://github.com/mattes/migrate/issues/171)) -* [Google Cloud Spanner](database/spanner) -* [CockroachDB](database/cockroachdb) -* [YugabyteDB](database/yugabytedb) -* [ClickHouse](database/clickhouse) -* [Firebird](database/firebird) -* [MS SQL Server](database/sqlserver) -* [rqlite](database/rqlite) +- [PostgreSQL](database/postgres) +- [PGX v4](database/pgx) +- [PGX v5](database/pgx/v5) +- [Redshift](database/redshift) +- [Ql](database/ql) +- [Cassandra / ScyllaDB](database/cassandra) +- [SQLite](database/sqlite) +- [SQLite3](database/sqlite3) ([todo #165](https://github.com/mattes/migrate/issues/165)) +- [SQLCipher](database/sqlcipher) +- [MySQL / MariaDB](database/mysql) +- [Neo4j](database/neo4j) +- [MongoDB](database/mongodb) +- [CrateDB](database/crate) ([todo #170](https://github.com/mattes/migrate/issues/170)) +- [Shell](database/shell) ([todo #171](https://github.com/mattes/migrate/issues/171)) +- [Google Cloud Spanner](database/spanner) +- [CockroachDB](database/cockroachdb) +- [YugabyteDB](database/yugabytedb) +- [ClickHouse](database/clickhouse) +- [Firebird](database/firebird) +- [MS SQL Server](database/sqlserver) +- [rqlite](database/rqlite) +- [libsql (Turso)](database/libsql) ### Database URLs @@ -70,24 +71,24 @@ $ Source drivers read migrations from local or remote sources. [Add a new source?](source/driver.go) -* [Filesystem](source/file) - read from filesystem -* [io/fs](source/iofs) - read from a Go [io/fs](https://pkg.go.dev/io/fs#FS) -* [Go-Bindata](source/go_bindata) - read from embedded binary data ([jteeuwen/go-bindata](https://github.com/jteeuwen/go-bindata)) -* [pkger](source/pkger) - read from embedded binary data ([markbates/pkger](https://github.com/markbates/pkger)) -* [GitHub](source/github) - read from remote GitHub repositories -* [GitHub Enterprise](source/github_ee) - read from remote GitHub Enterprise repositories -* [Bitbucket](source/bitbucket) - read from remote Bitbucket repositories -* [Gitlab](source/gitlab) - read from remote Gitlab repositories -* [AWS S3](source/aws_s3) - read from Amazon Web Services S3 -* [Google Cloud Storage](source/google_cloud_storage) - read from Google Cloud Platform Storage +- [Filesystem](source/file) - read from filesystem +- [io/fs](source/iofs) - read from a Go [io/fs](https://pkg.go.dev/io/fs#FS) +- [Go-Bindata](source/go_bindata) - read from embedded binary data ([jteeuwen/go-bindata](https://github.com/jteeuwen/go-bindata)) +- [pkger](source/pkger) - read from embedded binary data ([markbates/pkger](https://github.com/markbates/pkger)) +- [GitHub](source/github) - read from remote GitHub repositories +- [GitHub Enterprise](source/github_ee) - read from remote GitHub Enterprise repositories +- [Bitbucket](source/bitbucket) - read from remote Bitbucket repositories +- [Gitlab](source/gitlab) - read from remote Gitlab repositories +- [AWS S3](source/aws_s3) - read from Amazon Web Services S3 +- [Google Cloud Storage](source/google_cloud_storage) - read from Google Cloud Platform Storage ## CLI usage -* Simple wrapper around this library. -* Handles ctrl+c (SIGINT) gracefully. -* No config search paths, no config files, no magic ENV var injections. +- Simple wrapper around this library. +- Handles ctrl+c (SIGINT) gracefully. +- No config search paths, no config files, no magic ENV var injections. -__[CLI Documentation](cmd/migrate)__ +**[CLI Documentation](cmd/migrate)** ### Basic usage @@ -104,14 +105,14 @@ $ docker run -v {{ migration dir }}:/migrations --network host migrate/migrate ## Use in your Go project -* API is stable and frozen for this release (v3 & v4). -* Uses [Go modules](https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more) to manage dependencies. -* To help prevent database corruptions, it supports graceful stops via `GracefulStop chan bool`. -* Bring your own logger. -* Uses `io.Reader` streams internally for low memory overhead. -* Thread-safe and no goroutine leaks. +- API is stable and frozen for this release (v3 & v4). +- Uses [Go modules](https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more) to manage dependencies. +- To help prevent database corruptions, it supports graceful stops via `GracefulStop chan bool`. +- Bring your own logger. +- Uses `io.Reader` streams internally for low memory overhead. +- Thread-safe and no goroutine leaks. -__[Go Documentation](https://pkg.go.dev/github.com/golang-migrate/migrate/v4)__ +**[Go Documentation](https://pkg.go.dev/github.com/golang-migrate/migrate/v4)** ```go import ( @@ -155,8 +156,8 @@ Go to [getting started](GETTING_STARTED.md) ## Tutorials -* [CockroachDB](database/cockroachdb/TUTORIAL.md) -* [PostgreSQL](database/postgres/TUTORIAL.md) +- [CockroachDB](database/cockroachdb/TUTORIAL.md) +- [PostgreSQL](database/postgres/TUTORIAL.md) (more tutorials to come) @@ -174,15 +175,15 @@ Each migration has an up and down migration. [Why?](FAQ.md#why-two-separate-file ## Coming from another db migration tool? Check out [migradaptor](https://github.com/musinit/migradaptor/). -*Note: migradaptor is not affliated or supported by this project* +_Note: migradaptor is not affliated or supported by this project_ ## Versions -Version | Supported? | Import | Notes ---------|------------|--------|------ -**master** | :white_check_mark: | `import "github.com/golang-migrate/migrate/v4"` | New features and bug fixes arrive here first | -**v4** | :white_check_mark: | `import "github.com/golang-migrate/migrate/v4"` | Used for stable releases | -**v3** | :x: | `import "github.com/golang-migrate/migrate"` (with package manager) or `import "gopkg.in/golang-migrate/migrate.v3"` (not recommended) | **DO NOT USE** - No longer supported | +| Version | Supported? | Import | Notes | +| ---------- | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | +| **master** | :white_check_mark: | `import "github.com/golang-migrate/migrate/v4"` | New features and bug fixes arrive here first | +| **v4** | :white_check_mark: | `import "github.com/golang-migrate/migrate/v4"` | Used for stable releases | +| **v3** | :x: | `import "github.com/golang-migrate/migrate"` (with package manager) or `import "gopkg.in/golang-migrate/migrate.v3"` (not recommended) | **DO NOT USE** - No longer supported | ## Development and Contributing From 6aabe6144d1e71a9e92e07a36b789b5f2b705239 Mon Sep 17 00:00:00 2001 From: Alexandre Vezina Date: Mon, 11 Mar 2024 12:42:06 -0400 Subject: [PATCH 08/13] Bugfixes + README update - Fixed Drop failing when a table has AUTOINCREMENT - Updated README.md to explain URL scheme - Updated README.md to add instructions on how to connect to a turso dev --- database/libsql/README.md | 19 +++++++++++++++++-- .../migrations/33_create_table.up.sql | 1 + .../migrations/44_alter_table.down.sql | 3 ++- .../examples/migrations/44_alter_table.up.sql | 5 +++++ database/libsql/libsql.go | 19 ++++++++++--------- database/libsql/libsql_test.go | 2 ++ 6 files changed, 37 insertions(+), 12 deletions(-) diff --git a/database/libsql/README.md b/database/libsql/README.md index 2fa4d3ac7..bb80c8863 100644 --- a/database/libsql/README.md +++ b/database/libsql/README.md @@ -1,8 +1,13 @@ # libsql -To use with Turso +To use with Turso, you can use the URL provided by Turso like this: -`libsql://[DATABASE].turso.io?authToken=[TOKEN]&query` +`libsql://libsql://[DATABASE].turso.io?authToken=[TOKEN]&query` + +The first `libsql://` is used by `migrate` to use the correct driver. The 2nd one is used by `libsql` internally to select either HTTP or HTTPS scheme (https://github.com/tursodatabase/libsql-client-go/blob/4ae0eb9d0898e03e96490c91c9a8c55d1167684d/libsql/sql.go#L109) + +You can also use any of these schemes as needed: +`libsql://, file://, https://, http://, wss:// and ws://` Unlike other migrate database drivers, the libsql driver will automatically wrap each migration in an implicit transaction by default. Migrations must not contain explicit `BEGIN` or `COMMIT` statements. This behavior may change in a future major release. (See below for a workaround.) @@ -13,6 +18,16 @@ Refer to [upstream documentation](https://github.com/mattn/go-sqlite3/blob/maste | `x-migrations-table` | `MigrationsTable` | Name of the migrations table. Defaults to `schema_migrations`. | | `x-no-tx-wrap` | `NoTxWrap` | Disable implicit transactions when `true`. Migrations may, and should, contain explicit `BEGIN` and `COMMIT` statements. | +## Local dev + +- Run Turso locally + +`turso dev --db-file test.db` + +- Use migrate command + +`migrate -source file://./database/libsql/examples/migrations/ -verbose --database "libsql://http://localhost:8080" up` + ## Notes - Uses the `https://github.com/libsql/go-libsql` libsql db driver (cgo) diff --git a/database/libsql/examples/migrations/33_create_table.up.sql b/database/libsql/examples/migrations/33_create_table.up.sql index 5ad3404d1..003790c0f 100644 --- a/database/libsql/examples/migrations/33_create_table.up.sql +++ b/database/libsql/examples/migrations/33_create_table.up.sql @@ -1,3 +1,4 @@ CREATE TABLE pets ( + id INTEGER PRIMARY KEY AUTOINCREMENT, name string ); \ No newline at end of file diff --git a/database/libsql/examples/migrations/44_alter_table.down.sql b/database/libsql/examples/migrations/44_alter_table.down.sql index 72d18c554..1c98e34f7 100644 --- a/database/libsql/examples/migrations/44_alter_table.down.sql +++ b/database/libsql/examples/migrations/44_alter_table.down.sql @@ -1 +1,2 @@ -DROP TABLE IF EXISTS pets; \ No newline at end of file +ALTER TABLE pets DROP COLUMN predator; +DROP TABLE IF EXISTS pets_with_fk; \ No newline at end of file diff --git a/database/libsql/examples/migrations/44_alter_table.up.sql b/database/libsql/examples/migrations/44_alter_table.up.sql index f0682fcca..9013d217d 100644 --- a/database/libsql/examples/migrations/44_alter_table.up.sql +++ b/database/libsql/examples/migrations/44_alter_table.up.sql @@ -1 +1,6 @@ ALTER TABLE pets ADD predator bool; + +CREATE TABLE pets_with_fk ( + foreign_key_column_name INTEGER, + FOREIGN KEY(foreign_key_column_name) REFERENCES pets(id) +); \ No newline at end of file diff --git a/database/libsql/libsql.go b/database/libsql/libsql.go index 0345adfa5..79c0fa0c7 100644 --- a/database/libsql/libsql.go +++ b/database/libsql/libsql.go @@ -255,16 +255,17 @@ func (d *LibSQL) Drop() (err error) { return &database.Error{OrigErr: err, Query: []byte(query)} } - if len(tableNames) > 0 { - for _, t := range tableNames { - query := "DROP TABLE " + t - err = d.executeQuery(query) - if err != nil { - return &database.Error{OrigErr: err, Query: []byte(query)} - } + // We range over the tables in reverse order to avoid hitting foreign key constaints + for i := len(tableNames) - 1; i >= 0; i-- { + t := tableNames[i] + + // table sqlite_sequence may not be dropped + if t == "sqlite_sequence" { + continue } - query := "VACUUM" - _, err = d.db.Query(query) + + query := "DROP TABLE " + t + err = d.executeQuery(query) if err != nil { return &database.Error{OrigErr: err, Query: []byte(query)} } diff --git a/database/libsql/libsql_test.go b/database/libsql/libsql_test.go index 7406da2c6..ac8a226fb 100644 --- a/database/libsql/libsql_test.go +++ b/database/libsql/libsql_test.go @@ -25,6 +25,7 @@ func Test(t *testing.T) { t.Fatal(err) } dt.Test(t, d, []byte("CREATE TABLE t (Qty int, Name string);")) + dt.TestDrop(t, d) } func TestMigrate(t *testing.T) { @@ -111,6 +112,7 @@ func TestNoTxWrap(t *testing.T) { // An explicit BEGIN statement would ordinarily fail without x-no-tx-wrap. // (Transactions in sqlite may not be nested.) dt.Test(t, d, []byte("BEGIN; CREATE TABLE t (Qty int, Name string); COMMIT;")) + dt.TestDrop(t, d) } func TestNoTxWrapInvalidValue(t *testing.T) { From 835cb3fcf9bf709b1e02d824b3a1782bb44159fe Mon Sep 17 00:00:00 2001 From: Alexandre Vezina Date: Mon, 11 Mar 2024 12:59:48 -0400 Subject: [PATCH 09/13] Drop() now drops views before tables --- .../migrations/55_create_view.down.sql | 1 + .../examples/migrations/55_create_view.up.sql | 1 + database/libsql/libsql.go | 55 +++++++++++++++++-- 3 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 database/libsql/examples/migrations/55_create_view.down.sql create mode 100644 database/libsql/examples/migrations/55_create_view.up.sql diff --git a/database/libsql/examples/migrations/55_create_view.down.sql b/database/libsql/examples/migrations/55_create_view.down.sql new file mode 100644 index 000000000..0275d015b --- /dev/null +++ b/database/libsql/examples/migrations/55_create_view.down.sql @@ -0,0 +1 @@ +DROP VIEW IF EXISTS pets_view; \ No newline at end of file diff --git a/database/libsql/examples/migrations/55_create_view.up.sql b/database/libsql/examples/migrations/55_create_view.up.sql new file mode 100644 index 000000000..45aabc417 --- /dev/null +++ b/database/libsql/examples/migrations/55_create_view.up.sql @@ -0,0 +1 @@ +CREATE VIEW pets_view AS SELECT name FROM pets; \ No newline at end of file diff --git a/database/libsql/libsql.go b/database/libsql/libsql.go index 79c0fa0c7..c543e83d8 100644 --- a/database/libsql/libsql.go +++ b/database/libsql/libsql.go @@ -230,6 +230,49 @@ func (d *LibSQL) Version() (version int, dirty bool, err error) { } func (d *LibSQL) Drop() (err error) { + if err := d.dropViews(); err != nil { + return err + } + + if err := d.dropTables(); err != nil { + return err + } + + return nil +} + +func (d *LibSQL) dropViews() (err error) { + query := `SELECT name FROM sqlite_master WHERE type = 'view';` + views, err := d.db.Query(query) + if err != nil { + return &database.Error{OrigErr: err, Query: []byte(query)} + } + defer func() { + if errClose := views.Close(); errClose != nil { + err = multierror.Append(err, errClose) + } + }() + + for views.Next() { + var viewName string + if err := views.Scan(&viewName); err != nil { + return err + } + if err := views.Err(); err != nil { + return &database.Error{OrigErr: err, Query: []byte(query)} + } + + query = "DROP VIEW " + viewName + err = d.executeQuery(query) + if err != nil { + return &database.Error{OrigErr: err, Query: []byte(query)} + } + } + + return nil +} + +func (d *LibSQL) dropTables() (err error) { query := `SELECT name FROM sqlite_master WHERE type = 'table';` tables, err := d.db.Query(query) if err != nil { @@ -247,15 +290,15 @@ func (d *LibSQL) Drop() (err error) { if err := tables.Scan(&tableName); err != nil { return err } - if len(tableName) > 0 { - tableNames = append(tableNames, tableName) + + if err := tables.Err(); err != nil { + return &database.Error{OrigErr: err, Query: []byte(query)} } - } - if err := tables.Err(); err != nil { - return &database.Error{OrigErr: err, Query: []byte(query)} + + tableNames = append(tableNames, tableName) } - // We range over the tables in reverse order to avoid hitting foreign key constaints + // We range over the tables in reverse order to avoid hitting foreign key constraints for i := len(tableNames) - 1; i >= 0; i-- { t := tableNames[i] From f2ea65f967034aa95995b5565acf8fc35920b3a7 Mon Sep 17 00:00:00 2001 From: Alexandre Vezina Date: Mon, 11 Mar 2024 14:46:48 -0400 Subject: [PATCH 10/13] Fixed bug where dropViews was not releasing the lock launching DROP VIEW query --- database/libsql/libsql.go | 11 +++++++++-- database/libsql/libsql_test.go | 4 +--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/database/libsql/libsql.go b/database/libsql/libsql.go index c543e83d8..8266a2e05 100644 --- a/database/libsql/libsql.go +++ b/database/libsql/libsql.go @@ -222,7 +222,9 @@ func (d *LibSQL) SetVersion(version int, dirty bool) error { func (d *LibSQL) Version() (version int, dirty bool, err error) { query := "SELECT version, dirty FROM " + d.config.MigrationsTable + " LIMIT 1" - err = d.db.QueryRow(query).Scan(&version, &dirty) + q := d.db.QueryRow(query) + err = q.Scan(&version, &dirty) + if err != nil { return database.NilVersion, false, nil } @@ -253,6 +255,7 @@ func (d *LibSQL) dropViews() (err error) { } }() + viewNames := make([]string, 0) for views.Next() { var viewName string if err := views.Scan(&viewName); err != nil { @@ -262,7 +265,11 @@ func (d *LibSQL) dropViews() (err error) { return &database.Error{OrigErr: err, Query: []byte(query)} } - query = "DROP VIEW " + viewName + viewNames = append(viewNames, viewName) + } + + for _, v := range viewNames { + query := "DROP VIEW " + v err = d.executeQuery(query) if err != nil { return &database.Error{OrigErr: err, Query: []byte(query)} diff --git a/database/libsql/libsql_test.go b/database/libsql/libsql_test.go index ac8a226fb..2f9138d95 100644 --- a/database/libsql/libsql_test.go +++ b/database/libsql/libsql_test.go @@ -48,9 +48,7 @@ func TestMigrate(t *testing.T) { t.Fatal(err) } - m, err := migrate.NewWithDatabaseInstance( - "file://./examples/migrations", - "ql", driver) + m, err := migrate.NewWithDatabaseInstance("file://./examples/migrations", "ql", driver) if err != nil { t.Fatal(err) } From 724435c5a75e1bd6ff392fcf8e99b576f34624f7 Mon Sep 17 00:00:00 2001 From: Alexandre Vezina Date: Fri, 7 Jun 2024 14:37:41 -0400 Subject: [PATCH 11/13] Dropped support to open .db files directly + updated dependencies --- database/libsql/README.md | 4 +- database/libsql/libsql.go | 6 +++ go.mod | 22 +++++------ go.sum | 80 +++++++++++---------------------------- 4 files changed, 41 insertions(+), 71 deletions(-) diff --git a/database/libsql/README.md b/database/libsql/README.md index bb80c8863..f38d316f5 100644 --- a/database/libsql/README.md +++ b/database/libsql/README.md @@ -7,7 +7,7 @@ To use with Turso, you can use the URL provided by Turso like this: The first `libsql://` is used by `migrate` to use the correct driver. The 2nd one is used by `libsql` internally to select either HTTP or HTTPS scheme (https://github.com/tursodatabase/libsql-client-go/blob/4ae0eb9d0898e03e96490c91c9a8c55d1167684d/libsql/sql.go#L109) You can also use any of these schemes as needed: -`libsql://, file://, https://, http://, wss:// and ws://` +`libsql://, https://, http://, wss:// and ws://` Unlike other migrate database drivers, the libsql driver will automatically wrap each migration in an implicit transaction by default. Migrations must not contain explicit `BEGIN` or `COMMIT` statements. This behavior may change in a future major release. (See below for a workaround.) @@ -30,4 +30,4 @@ Refer to [upstream documentation](https://github.com/mattn/go-sqlite3/blob/maste ## Notes -- Uses the `https://github.com/libsql/go-libsql` libsql db driver (cgo) +- Uses the `github.com/tursodatabase/libsql-client-go/libsql` libsql db driver diff --git a/database/libsql/libsql.go b/database/libsql/libsql.go index 8266a2e05..83b6fb953 100644 --- a/database/libsql/libsql.go +++ b/database/libsql/libsql.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/go-multierror" _ "github.com/tursodatabase/libsql-client-go/libsql" + _ "modernc.org/sqlite" ) func init() { @@ -48,6 +49,11 @@ func (d *LibSQL) Open(url string) (database.Driver, error) { } dbfile := strings.Replace(migrate.FilterCustomQuery(purl).String(), "libsql://", "", 1) + + if strings.HasPrefix(dbfile, "file://") { + return nil, fmt.Errorf("invalid URL: %s file:// is not supported", dbfile) + } + db, err := sql.Open("libsql", dbfile) if err != nil { return nil, err diff --git a/go.mod b/go.mod index 3cb2c5d33..bdf11f8fb 100644 --- a/go.mod +++ b/go.mod @@ -33,21 +33,21 @@ require ( github.com/neo4j/neo4j-go-driver v1.8.1-0.20200803113522-b626aa943eba github.com/snowflakedb/gosnowflake v1.6.19 github.com/stretchr/testify v1.8.3 - github.com/tursodatabase/libsql-client-go v0.0.0-20240220085343-4ae0eb9d0898 + github.com/tursodatabase/libsql-client-go v0.0.0-20240416075003-747366ff79c4 github.com/xanzy/go-gitlab v0.15.0 go.mongodb.org/mongo-driver v1.7.5 go.uber.org/atomic v1.7.0 golang.org/x/oauth2 v0.14.0 - golang.org/x/tools v0.10.0 + golang.org/x/tools v0.19.0 google.golang.org/api v0.150.0 modernc.org/ql v1.0.0 modernc.org/sqlite v1.18.1 ) require ( - github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 // indirect - github.com/libsql/sqlite-antlr4-parser v0.0.0-20230802215326-5cb5bb604475 // indirect - nhooyr.io/websocket v1.8.7 // indirect + github.com/antlr4-go/antlr/v4 v4.13.0 // indirect + github.com/libsql/sqlite-antlr4-parser v0.0.0-20240327125255-dbf53b6cbf06 // indirect + nhooyr.io/websocket v1.8.10 // indirect ) require ( @@ -160,13 +160,13 @@ require ( github.com/zeebo/xxh3 v1.0.2 // indirect gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0 // indirect - golang.org/x/mod v0.11.0 // indirect - golang.org/x/net v0.18.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect + golang.org/x/mod v0.16.0 // indirect + golang.org/x/net v0.22.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/term v0.15.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect diff --git a/go.sum b/go.sum index 5ad692eb0..8695e6249 100644 --- a/go.sum +++ b/go.sum @@ -72,8 +72,8 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 h1:goHVqTbFX3AIo0tzGr14pgfAW2ZfPChKO21Z9MGf/gk= -github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= +github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= +github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= github.com/apache/arrow/go/v10 v10.0.1 h1:n9dERvixoC/1JjDmBcs9FPaEryoANa2sCgVFo6ez9cI= github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= github.com/apache/thrift v0.16.0 h1:qEy6UW60iVOlUy+b9ZR0d5WzUWYGOo4HfopoyBaNmoY= @@ -194,21 +194,10 @@ github.com/fsouza/fake-gcs-server v1.17.0 h1:OeH75kBZcZa3ZE+zz/mFdJ2btt9FgqfjI7g github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw= github.com/gabriel-vasile/mimetype v1.4.1 h1:TRWk7se+TOjCYgRth7+1/OYLNiRNIotknkFtf/dnN7Q= github.com/gabriel-vasile/mimetype v1.4.1/go.mod h1:05Vi0w3Y9c/lNvJOdmIwvrrAhX3rYhfQQCaf9VJcv7M= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -217,12 +206,6 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gobuffalo/here v0.6.0 h1:hYrd0a6gDmWxBM4TnrGw8mQg24iSVoIkHEk7FodQcBI= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gocql/gocql v0.0.0-20210515062232-b7ef815b4556 h1:N/MD/sr6o61X+iZBAT2qEUF023s4KbA8RWfKzl0L6MQ= @@ -256,8 +239,6 @@ github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -294,7 +275,6 @@ github.com/google/go-github/v39 v39.2.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= @@ -321,8 +301,6 @@ github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= @@ -417,8 +395,6 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= @@ -433,7 +409,6 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= @@ -453,8 +428,6 @@ github.com/ktrysmt/go-bitbucket v0.6.4 h1:C8dUGp0qkwncKtAnozHCbbqhptefzEd1I0sfnu github.com/ktrysmt/go-bitbucket v0.6.4/go.mod h1:9u0v3hsd2rqCHRIpbir1oP7F58uo5dq19sBYvuMoyQ4= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -464,8 +437,8 @@ github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/libsql/sqlite-antlr4-parser v0.0.0-20230802215326-5cb5bb604475 h1:6PfEMwfInASh9hkN83aR0j4W/eKaAZt/AURtXAXlas0= -github.com/libsql/sqlite-antlr4-parser v0.0.0-20230802215326-5cb5bb604475/go.mod h1:20nXSmcf0nAscrzqsXeC2/tA3KkV2eCiJqYuyAgl+ss= +github.com/libsql/sqlite-antlr4-parser v0.0.0-20240327125255-dbf53b6cbf06 h1:JLvn7D+wXjH9g4Jsjo+VqmzTUpl/LX7vfr6VOfSWTdM= +github.com/libsql/sqlite-antlr4-parser v0.0.0-20240327125255-dbf53b6cbf06/go.mod h1:FUkZ5OHjlGPjnM2UyGJz9TypXQFgYqw6AFNO1UiROTM= github.com/markbates/pkger v0.15.1 h1:3MPelV53RnGSW07izx5xGxl4e/sdRD6zqseIk0rMASY= github.com/markbates/pkger v0.15.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -498,10 +471,6 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= @@ -588,12 +557,8 @@ github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gt github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tursodatabase/libsql-client-go v0.0.0-20240220085343-4ae0eb9d0898 h1:1MvEhzI5pvP27e9Dzz861mxk9WzXZLSJwzOU67cKTbU= -github.com/tursodatabase/libsql-client-go v0.0.0-20240220085343-4ae0eb9d0898/go.mod h1:9bKuHS7eZh/0mJndbUOrCx8Ej3PlsRDszj4L7oVYMPQ= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/tursodatabase/libsql-client-go v0.0.0-20240416075003-747366ff79c4 h1:wNN8t3qiLLzFiETD4jL086WemAgQLfARClUx2Jfk78w= +github.com/tursodatabase/libsql-client-go v0.0.0-20240416075003-747366ff79c4/go.mod h1:2Fu26tjM011BLeR5+jwTfs6DX/fNMEWV/3CBZvggrA4= github.com/xanzy/go-gitlab v0.15.0 h1:rWtwKTgEnXyNUGrOArN7yyc3THRkpYcKXIXia9abywQ= github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= @@ -657,8 +622,8 @@ golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -666,8 +631,8 @@ golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm0 golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0 h1:pVgRXcIictcr+lBQIFeiwuwtDIs4eL21OuM9nyAADmo= -golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -687,8 +652,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -721,8 +686,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180227000427-d7d64896b5ff/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -788,16 +753,16 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -814,7 +779,6 @@ golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -853,8 +817,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.10.0 h1:tvDr/iQoUqNdohiYm0LmmKcBk+q86lb9EprIUFhHHGg= -golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1017,8 +981,8 @@ modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.5.1 h1:RTNHdsrOpeoSeOF4FbzTo8gBYByaJ5xT7NgZ9ZqRiJM= modernc.org/zappy v1.0.0 h1:dPVaP+3ueIUv4guk8PuZ2wiUGcJ1WUVvIheeSSTD0yk= modernc.org/zappy v1.0.0/go.mod h1:hHe+oGahLVII/aTTyWK/b53VDHMAGCBYYeZ9sn83HC4= -nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +nhooyr.io/websocket v1.8.10 h1:mv4p+MnGrLDcPlBoWsvPP7XCzTYMXP9F9eIGoKbgx7Q= +nhooyr.io/websocket v1.8.10/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= From 0a0cff5ffca8747b899a833476f753663dc2e1d5 Mon Sep 17 00:00:00 2001 From: Alexandre Vezina Date: Fri, 7 Jun 2024 14:45:29 -0400 Subject: [PATCH 12/13] Removed unused import --- database/libsql/libsql.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/database/libsql/libsql.go b/database/libsql/libsql.go index 83b6fb953..bef817fc0 100644 --- a/database/libsql/libsql.go +++ b/database/libsql/libsql.go @@ -14,8 +14,7 @@ import ( "github.com/hashicorp/go-multierror" _ "github.com/tursodatabase/libsql-client-go/libsql" - _ "modernc.org/sqlite" -) +)gi func init() { database.Register("libsql", &LibSQL{}) From 43091c5619a5d86b6eda88363c2244771eabce98 Mon Sep 17 00:00:00 2001 From: Alexandre Vezina Date: Fri, 7 Jun 2024 14:53:14 -0400 Subject: [PATCH 13/13] Fixed typo --- database/libsql/libsql.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/libsql/libsql.go b/database/libsql/libsql.go index bef817fc0..ef10962a0 100644 --- a/database/libsql/libsql.go +++ b/database/libsql/libsql.go @@ -14,7 +14,7 @@ import ( "github.com/hashicorp/go-multierror" _ "github.com/tursodatabase/libsql-client-go/libsql" -)gi +) func init() { database.Register("libsql", &LibSQL{})