diff --git a/Makefile b/Makefile index eb7cd5d..b6f4a1f 100644 --- a/Makefile +++ b/Makefile @@ -2,10 +2,10 @@ tidy_dependencies: go mod tidy migrate: - migrate -path ./datastore/postgres/migrations/ -database "postgres://sdump:sdump@localhost:3432/sdump?sslmode=disable" up + migrate -path ./datastore/sql/migrations/ -database "postgres://sdump:sdump@localhost:3432/sdump?sslmode=disable" up migrate-down: - migrate -path ./datastore/postgres/migrations/ -database "postgres://sdump:sdump@localhost:3432/sdump?sslmode=disable" down + migrate -path ./datastore/sql/migrations/ -database "postgres://sdump:sdump@localhost:3432/sdump?sslmode=disable" down run-http: go run cmd/*.go diff --git a/cmd/delete.go b/cmd/delete.go index aeabca0..c39c699 100644 --- a/cmd/delete.go +++ b/cmd/delete.go @@ -6,7 +6,7 @@ import ( "github.com/adelowo/sdump" "github.com/adelowo/sdump/config" - "github.com/adelowo/sdump/datastore/postgres" + sdumpSql "github.com/adelowo/sdump/datastore/sql" "github.com/spf13/cobra" ) @@ -16,12 +16,12 @@ func createDeleteCommand(rootCmd *cobra.Command, cfg *config.Config) { Aliases: []string{"d"}, Short: "Deletes all old HTTP requests to preserve DB space", RunE: func(_ *cobra.Command, _ []string) error { - db, err := postgres.New(cfg.HTTP.Database.DSN, cfg.HTTP.Database.LogQueries) + db, err := sdumpSql.New(cfg.HTTP.Database) if err != nil { return err } - ingestStore := postgres.NewIngestRepository(db) + ingestStore := sdumpSql.NewIngestRepository(db) before := time.Now().Add(-1 * cfg.Cron.TTL) diff --git a/cmd/http.go b/cmd/http.go index ee7dcf0..9640c59 100644 --- a/cmd/http.go +++ b/cmd/http.go @@ -8,7 +8,7 @@ import ( "time" "github.com/adelowo/sdump/config" - "github.com/adelowo/sdump/datastore/postgres" + sdumpSql "github.com/adelowo/sdump/datastore/sql" "github.com/adelowo/sdump/server/httpd" "github.com/r3labs/sse/v2" "github.com/sethvargo/go-limiter/memorystore" @@ -53,11 +53,6 @@ func createHTTPCommand(cmd *cobra.Command, cfg *config.Config) { logrus.SetOutput(os.Stdout) logrus.SetLevel(lvl) - db, err := postgres.New(cfg.HTTP.Database.DSN, cfg.HTTP.Database.LogQueries) - if err != nil { - return err - } - var tokensPerMinute uint64 = 60 if cfg.HTTP.RateLimit.RequestsPerMinute > 0 { tokensPerMinute = cfg.HTTP.RateLimit.RequestsPerMinute @@ -71,9 +66,13 @@ func createHTTPCommand(cmd *cobra.Command, cfg *config.Config) { return err } - urlStore := postgres.NewURLRepositoryTable(db) - ingestStore := postgres.NewIngestRepository(db) - userStore := postgres.NewUserRepositoryTable(db) + db, err := sdumpSql.New(cfg.HTTP.Database) + if err != nil { + return err + } + urlStore := sdumpSql.NewURLRepositoryTable(db) + ingestStore := sdumpSql.NewIngestRepository(db) + userStore := sdumpSql.NewUserRepositoryTable(db) hostName, err := os.Hostname() if err != nil { diff --git a/config.yml b/config.yml index 9d9b106..14ee20c 100644 --- a/config.yml +++ b/config.yml @@ -39,8 +39,10 @@ http: database: ## database dsn dsn: postgres://sdump:sdump@localhost:3432/sdump?sslmode=disable + # dsn: "file::memory:?cache=shared" ## should we log sql queries? In prod, no but in local mode, you probably want to log_queries: true + # driver: "sqlite" # limit the size of jSON request body that can be sent to endpoints max_request_body_size: 500 diff --git a/config/config.go b/config/config.go index 1788e8f..d9f71ef 100644 --- a/config/config.go +++ b/config/config.go @@ -1,8 +1,10 @@ package config -import "time" +import ( + "time" +) -// ENUM(psql) +// ENUM(psql, sqlite) type DatabaseType string type SSHConfig struct { @@ -19,6 +21,12 @@ type SSHConfig struct { AllowList []string `json:"allow_list,omitempty" mapstructure:"allow_list" yaml:"allow_list"` } +type DatabaseConfig struct { + DSN string `mapstructure:"dsn" json:"dsn,omitempty" yaml:"dsn"` + LogQueries bool `mapstructure:"log_queries" json:"log_queries,omitempty" yaml:"log_queries"` + Driver DatabaseType `mapstructure:"driver" json:"driver,omitempty" yaml:"driver,omitempty"` +} + type HTTPConfig struct { // Port to run http server on // The server @@ -31,10 +39,7 @@ type HTTPConfig struct { // If empty, server would crash AdminSecret string `mapstructure:"admin_secret" json:"admin_secret,omitempty" yaml:"admin_secret"` - Database struct { - DSN string `mapstructure:"dsn" json:"dsn,omitempty" yaml:"dsn"` - LogQueries bool `mapstructure:"log_queries" json:"log_queries,omitempty" yaml:"log_queries"` - } `mapstructure:"database" json:"database,omitempty" yaml:"database"` + Database DatabaseConfig `mapstructure:"database" json:"database,omitempty" yaml:"database"` Domain string `json:"domain,omitempty" yaml:"domain" mapstructure:"domain"` MaxRequestBodySize int64 `json:"max_request_body_size,omitempty" yaml:"max_request_body_size" mapstructure:"max_request_body_size"` diff --git a/config/config_enum.go b/config/config_enum.go index a3b24cf..03d3a89 100644 --- a/config/config_enum.go +++ b/config/config_enum.go @@ -1,8 +1,8 @@ // Code generated by go-enum DO NOT EDIT. -// Version: -// Revision: -// Build Date: -// Built By: +// Version: 0.6.0 +// Revision: 919e61c0174b91303753ee3898569a01abb32c97 +// Build Date: 2023-12-18T15:54:43Z +// Built By: goreleaser package config @@ -14,6 +14,8 @@ import ( const ( // DatabaseTypePsql is a DatabaseType of type psql. DatabaseTypePsql DatabaseType = "psql" + // DatabaseTypeSqlite is a DatabaseType of type sqlite. + DatabaseTypeSqlite DatabaseType = "sqlite" ) var ErrInvalidDatabaseType = errors.New("not a valid DatabaseType") @@ -31,7 +33,8 @@ func (x DatabaseType) IsValid() bool { } var _DatabaseTypeValue = map[string]DatabaseType{ - "psql": DatabaseTypePsql, + "psql": DatabaseTypePsql, + "sqlite": DatabaseTypeSqlite, } // ParseDatabaseType attempts to convert a string to a DatabaseType. diff --git a/datastore/postgres/postgres.go b/datastore/postgres/postgres.go deleted file mode 100644 index c7743a0..0000000 --- a/datastore/postgres/postgres.go +++ /dev/null @@ -1,25 +0,0 @@ -package postgres - -import ( - "database/sql" - - "github.com/uptrace/bun" - "github.com/uptrace/bun/dialect/pgdialect" - "github.com/uptrace/bun/driver/pgdriver" - "github.com/uptrace/bun/extra/bundebug" - "github.com/uptrace/bun/extra/bunotel" -) - -func New(dsn string, logQueries bool) (*bun.DB, error) { - pgdb := sql.OpenDB(pgdriver.NewConnector(pgdriver.WithDSN(dsn))) - - db := bun.NewDB(pgdb, pgdialect.New()) - - db.AddQueryHook(bunotel.NewQueryHook(bunotel.WithDBName("getclaimclaim"))) - - if logQueries { - db.AddQueryHook(bundebug.NewQueryHook(bundebug.WithVerbose(true))) - } - - return db, db.Ping() -} diff --git a/datastore/sql/driver.go b/datastore/sql/driver.go new file mode 100644 index 0000000..d830f79 --- /dev/null +++ b/datastore/sql/driver.go @@ -0,0 +1,54 @@ +package sql + +import ( + "database/sql" + + "github.com/adelowo/sdump/config" + "github.com/oiime/logrusbun" + "github.com/sirupsen/logrus" + "github.com/uptrace/bun" + "github.com/uptrace/bun/dialect/pgdialect" + "github.com/uptrace/bun/dialect/sqlitedialect" + "github.com/uptrace/bun/driver/pgdriver" + "github.com/uptrace/bun/driver/sqliteshim" + "github.com/uptrace/bun/extra/bunotel" +) + +func newPsql(cfg config.DatabaseConfig) (*bun.DB, error) { + pgdb := sql.OpenDB(pgdriver.NewConnector(pgdriver.WithDSN(cfg.DSN))) + + db := bun.NewDB(pgdb, pgdialect.New()) + log := logrus.New() + + db.AddQueryHook(bunotel.NewQueryHook(bunotel.WithDBName("getclaimclaim"))) + + if cfg.LogQueries { + db.AddQueryHook(logrusbun.NewQueryHook(logrusbun.QueryHookOptions{Logger: log})) + } + + return db, db.Ping() +} + +func newSqlite(cfg config.DatabaseConfig) (*bun.DB, error) { + sqlite, err := sql.Open(sqliteshim.ShimName, cfg.DSN) + if err != nil { + panic(err) + } + + db := bun.NewDB(sqlite, sqlitedialect.New()) + log := logrus.New() + + if cfg.LogQueries { + db.AddQueryHook(logrusbun.NewQueryHook(logrusbun.QueryHookOptions{Logger: log})) + } + + return db, db.Ping() +} + +func New(cfg config.DatabaseConfig) (*bun.DB, error) { + if cfg.Driver == config.DatabaseTypeSqlite { + return newSqlite(cfg) + } + + return newPsql(cfg) +} diff --git a/datastore/postgres/ingest.go b/datastore/sql/ingest.go similarity index 98% rename from datastore/postgres/ingest.go rename to datastore/sql/ingest.go index 54c17d2..c6818d1 100644 --- a/datastore/postgres/ingest.go +++ b/datastore/sql/ingest.go @@ -1,4 +1,4 @@ -package postgres +package sql import ( "context" diff --git a/datastore/postgres/ingest_test.go b/datastore/sql/ingest_test.go similarity index 91% rename from datastore/postgres/ingest_test.go rename to datastore/sql/ingest_test.go index 9ae12e6..81498ce 100644 --- a/datastore/postgres/ingest_test.go +++ b/datastore/sql/ingest_test.go @@ -1,7 +1,7 @@ //go:build integration // +build integration -package postgres +package sql import ( "context" @@ -12,7 +12,7 @@ import ( ) func TestIngestRepository_Create(t *testing.T) { - client, teardownFunc := setupDatabase(t) + client, teardownFunc := setupPostgresDatabase(t) defer teardownFunc() ingestStore := NewIngestRepository(client) diff --git a/datastore/postgres/migrations/20240120125102_create_url_tables.down.sql b/datastore/sql/migrations/20240120125102_create_url_tables.down.sql similarity index 100% rename from datastore/postgres/migrations/20240120125102_create_url_tables.down.sql rename to datastore/sql/migrations/20240120125102_create_url_tables.down.sql diff --git a/datastore/postgres/migrations/20240120125102_create_url_tables.up.sql b/datastore/sql/migrations/20240120125102_create_url_tables.up.sql similarity index 100% rename from datastore/postgres/migrations/20240120125102_create_url_tables.up.sql rename to datastore/sql/migrations/20240120125102_create_url_tables.up.sql diff --git a/datastore/postgres/migrations/20240120165926_create_http_ingest_table.down.sql b/datastore/sql/migrations/20240120165926_create_http_ingest_table.down.sql similarity index 100% rename from datastore/postgres/migrations/20240120165926_create_http_ingest_table.down.sql rename to datastore/sql/migrations/20240120165926_create_http_ingest_table.down.sql diff --git a/datastore/postgres/migrations/20240120165926_create_http_ingest_table.up.sql b/datastore/sql/migrations/20240120165926_create_http_ingest_table.up.sql similarity index 100% rename from datastore/postgres/migrations/20240120165926_create_http_ingest_table.up.sql rename to datastore/sql/migrations/20240120165926_create_http_ingest_table.up.sql diff --git a/datastore/postgres/migrations/20240130184834_create_users_and_plans_table.down.sql b/datastore/sql/migrations/20240130184834_create_users_and_plans_table.down.sql similarity index 100% rename from datastore/postgres/migrations/20240130184834_create_users_and_plans_table.down.sql rename to datastore/sql/migrations/20240130184834_create_users_and_plans_table.down.sql diff --git a/datastore/postgres/migrations/20240130184834_create_users_and_plans_table.up.sql b/datastore/sql/migrations/20240130184834_create_users_and_plans_table.up.sql similarity index 100% rename from datastore/postgres/migrations/20240130184834_create_users_and_plans_table.up.sql rename to datastore/sql/migrations/20240130184834_create_users_and_plans_table.up.sql diff --git a/datastore/postgres/postgres_test.go b/datastore/sql/postgres_test.go similarity index 86% rename from datastore/postgres/postgres_test.go rename to datastore/sql/postgres_test.go index 4513376..7fb17eb 100644 --- a/datastore/postgres/postgres_test.go +++ b/datastore/sql/postgres_test.go @@ -1,7 +1,7 @@ //go:build integration // +build integration -package postgres +package sql import ( "context" @@ -9,6 +9,7 @@ import ( "fmt" "testing" + "github.com/adelowo/sdump/config" testfixtures "github.com/go-testfixtures/testfixtures/v3" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database/postgres" @@ -19,7 +20,7 @@ import ( "github.com/uptrace/bun" ) -func prepareTestDatabase(t *testing.T, dsn string) { +func preparePostgresTestDatabase(t *testing.T, dsn string) { t.Helper() var err error @@ -50,9 +51,9 @@ func prepareTestDatabase(t *testing.T, dsn string) { require.NoError(t, fixtures.Load()) } -// setupDatabase spins up a new Postgres container and returns a closure +// setupPostgresDatabase spins up a new Postgres container and returns a closure // please always make sure to call the closure as it is the teardown function -func setupDatabase(t *testing.T) (*bun.DB, func()) { +func setupPostgresDatabase(t *testing.T) (*bun.DB, func()) { t.Helper() var dsn string @@ -83,9 +84,11 @@ func setupDatabase(t *testing.T) (*bun.DB, func()) { dsn = fmt.Sprintf("postgres://%s:%s@%s/%s?sslmode=disable", "sdump", "sdump", fmt.Sprintf("localhost:%s", port.Port()), "sdumptest") - prepareTestDatabase(t, dsn) + preparePostgresTestDatabase(t, dsn) - client, err := New(dsn, false) + client, err := New(config.DatabaseConfig{ + DSN: dsn, + }) require.NoError(t, err) return client, func() { diff --git a/datastore/sql/sqlite_test.go b/datastore/sql/sqlite_test.go new file mode 100644 index 0000000..45a9976 --- /dev/null +++ b/datastore/sql/sqlite_test.go @@ -0,0 +1,67 @@ +//go:build integration +// +build integration + +package sql + +import ( + "database/sql" + "fmt" + "testing" + + "github.com/adelowo/sdump/config" + testfixtures "github.com/go-testfixtures/testfixtures/v3" + "github.com/stretchr/testify/require" + "github.com/uptrace/bun" + "github.com/uptrace/bun/driver/sqliteshim" + + "github.com/golang-migrate/migrate/v4" + "github.com/golang-migrate/migrate/v4/database/sqlite3" +) + +func prepareSqliteTestDatabase(t *testing.T, dsn string) { + t.Helper() + + var err error + + db, err := sql.Open(sqliteshim.ShimName, dsn) + require.NoError(t, err) + + require.NoError(t, db.Ping()) + + driver, err := sqlite3.WithInstance(db, &sqlite3.Config{}) + require.NoError(t, err) + + migrator, err := migrate.NewWithDatabaseInstance( + fmt.Sprintf("file://%s", "migrations"), "sqllite3", driver) + require.NoError(t, err) + + if err := migrator.Up(); err != nil && err != migrate.ErrNoChange { + require.NoError(t, err) + } + + fixtures, err := testfixtures.New( + testfixtures.Database(db), + testfixtures.Dialect("sqlite3"), + testfixtures.Directory("testdata/fixtures"), + ) + require.NoError(t, err) + + require.NoError(t, fixtures.Load()) +} + +func setupSqliteDatabase(t *testing.T) (*bun.DB, func()) { + t.Helper() + + dsn := "file::memory:?cache=shared" + + prepareSqliteTestDatabase(t, dsn) + + client, err := New(config.DatabaseConfig{ + DSN: dsn, + Driver: config.DatabaseTypeSqlite, + }) + require.NoError(t, err) + + return client, func() { + } +} diff --git a/datastore/postgres/testdata/fixtures/urls.yml b/datastore/sql/testdata/fixtures/urls.yml similarity index 100% rename from datastore/postgres/testdata/fixtures/urls.yml rename to datastore/sql/testdata/fixtures/urls.yml diff --git a/datastore/postgres/testdata/fixtures/users.yml b/datastore/sql/testdata/fixtures/users.yml similarity index 100% rename from datastore/postgres/testdata/fixtures/users.yml rename to datastore/sql/testdata/fixtures/users.yml diff --git a/datastore/postgres/url.go b/datastore/sql/url.go similarity index 98% rename from datastore/postgres/url.go rename to datastore/sql/url.go index 2d44c0b..c094f5f 100644 --- a/datastore/postgres/url.go +++ b/datastore/sql/url.go @@ -1,4 +1,4 @@ -package postgres +package sql import ( "context" diff --git a/datastore/postgres/url_test.go b/datastore/sql/url_test.go similarity index 88% rename from datastore/postgres/url_test.go rename to datastore/sql/url_test.go index d604302..e74bf75 100644 --- a/datastore/postgres/url_test.go +++ b/datastore/sql/url_test.go @@ -1,7 +1,7 @@ //go:build integration // +build integration -package postgres +package sql import ( "context" @@ -16,7 +16,7 @@ import ( var userID = uuid.MustParse("8511ac86-5079-42ae-a030-cb46e6dbfbda") func TestURLRepositoryTable_Create(t *testing.T) { - client, teardownFunc := setupDatabase(t) + client, teardownFunc := setupPostgresDatabase(t) defer teardownFunc() urlStore := NewURLRepositoryTable(client) @@ -26,7 +26,7 @@ func TestURLRepositoryTable_Create(t *testing.T) { } func TestURLRepositoryTable_Get(t *testing.T) { - client, teardownFunc := setupDatabase(t) + client, teardownFunc := setupPostgresDatabase(t) defer teardownFunc() urlStore := NewURLRepositoryTable(client) @@ -44,7 +44,7 @@ func TestURLRepositoryTable_Get(t *testing.T) { } func TestURLRepositoryTable_Latest(t *testing.T) { - client, teardownFunc := setupDatabase(t) + client, teardownFunc := setupPostgresDatabase(t) defer teardownFunc() urlStore := NewURLRepositoryTable(client) diff --git a/datastore/postgres/user.go b/datastore/sql/user.go similarity index 97% rename from datastore/postgres/user.go rename to datastore/sql/user.go index 27c86c0..4b3f525 100644 --- a/datastore/postgres/user.go +++ b/datastore/sql/user.go @@ -1,4 +1,4 @@ -package postgres +package sql import ( "context" diff --git a/datastore/postgres/user_test.go b/datastore/sql/user_test.go similarity index 88% rename from datastore/postgres/user_test.go rename to datastore/sql/user_test.go index 80aa02b..7205515 100644 --- a/datastore/postgres/user_test.go +++ b/datastore/sql/user_test.go @@ -1,7 +1,7 @@ //go:build integration // +build integration -package postgres +package sql import ( "context" @@ -15,7 +15,7 @@ import ( // var userID = uuid.MustParse("8511ac86-5079-42ae-a030-cb46e6dbfbda") func TestUserRepository_Create(t *testing.T) { - client, teardownFunc := setupDatabase(t) + client, teardownFunc := setupPostgresDatabase(t) defer teardownFunc() userStore := NewUserRepositoryTable(client) @@ -27,7 +27,7 @@ func TestUserRepository_Create(t *testing.T) { } func TestUserRepository_Find(t *testing.T) { - client, teardownFunc := setupDatabase(t) + client, teardownFunc := setupPostgresDatabase(t) defer teardownFunc() userStore := NewUserRepositoryTable(client) diff --git a/go.mod b/go.mod index 8f4d599..1bbd139 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/go-chi/telemetry v0.3.0 github.com/go-testfixtures/testfixtures/v3 v3.9.0 github.com/golang-migrate/migrate/v4 v4.17.0 - github.com/google/uuid v1.4.0 + github.com/google/uuid v1.6.0 github.com/prometheus/client_golang v1.17.0 github.com/r3labs/sse/v2 v2.10.0 github.com/riandyrn/otelchi v0.5.1 @@ -32,7 +32,9 @@ require ( github.com/testcontainers/testcontainers-go v0.27.0 github.com/uptrace/bun v1.1.17 github.com/uptrace/bun/dialect/pgdialect v1.1.17 + github.com/uptrace/bun/dialect/sqlitedialect v1.1.17 github.com/uptrace/bun/driver/pgdriver v1.1.17 + github.com/uptrace/bun/driver/sqliteshim v1.1.17 github.com/uptrace/bun/extra/bundebug v1.1.17 github.com/uptrace/bun/extra/bunotel v1.1.17 go.opentelemetry.io/otel v1.22.0 @@ -42,8 +44,8 @@ require ( go.opentelemetry.io/otel/trace v1.22.0 go.uber.org/mock v0.4.0 golang.design/x/clipboard v0.7.0 - golang.org/x/crypto v0.18.0 - golang.org/x/term v0.16.0 + golang.org/x/crypto v0.25.0 + golang.org/x/term v0.22.0 google.golang.org/grpc v1.61.0 ) @@ -90,6 +92,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect @@ -102,6 +105,7 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-sqlite3 v1.14.22 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/moby/patternmatcher v0.6.0 // indirect @@ -112,6 +116,8 @@ require ( github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/reflow v0.3.0 // indirect github.com/muesli/termenv v0.15.2 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect + github.com/oiime/logrusbun v0.1.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc5 // indirect github.com/opencontainers/runc v1.1.5 // indirect @@ -124,6 +130,7 @@ require ( github.com/prometheus/client_model v0.5.0 // indirect github.com/prometheus/common v0.45.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect @@ -157,12 +164,12 @@ require ( golang.org/x/exp/shiny v0.0.0-20240119083558-1b970713d09a // indirect golang.org/x/image v0.15.0 // indirect golang.org/x/mobile v0.0.0-20240112133503-c713f31d574b // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.20.0 // indirect - golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.16.0 // indirect - golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.17.0 // indirect + golang.org/x/mod v0.19.0 // indirect + golang.org/x/net v0.27.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.24.0 // indirect + golang.org/x/text v0.16.0 // indirect + golang.org/x/tools v0.23.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect google.golang.org/protobuf v1.32.0 // indirect @@ -170,4 +177,11 @@ require ( gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect mellium.im/sasl v0.3.1 // indirect + modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a // indirect + modernc.org/libc v1.60.1 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.8.0 // indirect + modernc.org/sqlite v1.32.0 // indirect + modernc.org/strutil v1.2.0 // indirect + modernc.org/token v1.1.0 // indirect ) diff --git a/go.sum b/go.sum index 3417ed1..b6461af 100644 --- a/go.sum +++ b/go.sum @@ -181,8 +181,10 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -190,6 +192,8 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= @@ -261,8 +265,8 @@ github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+Ei github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= @@ -293,6 +297,10 @@ github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +github.com/oiime/logrusbun v0.1.1 h1:o3aK0PGErb1G0JC43yAIhoGxSbgtYRHhlyTtq6o1rag= +github.com/oiime/logrusbun v0.1.1/go.mod h1:HH9akx9teKgQPX41TYpLLRNxaL8q9R+ltzABnwUHfBM= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= @@ -341,6 +349,8 @@ github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/r3labs/sse/v2 v2.10.0 h1:hFEkLLFY4LDifoHdiCN/LlGBAdVJYsANaLqNYa1l/v0= github.com/r3labs/sse/v2 v2.10.0/go.mod h1:Igau6Whc+F17QUgML1fYe1VPZzTV6EMCnYktEmkNJ7I= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/riandyrn/otelchi v0.5.1 h1:0/45omeqpP7f/cvdL16GddQBfAEmZvUyl2QzLSE6uYo= github.com/riandyrn/otelchi v0.5.1/go.mod h1:ZxVxNEl+jQ9uHseRYIxKWRb3OY8YXFEu+EkNiiSNUEA= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -430,12 +440,17 @@ github.com/u-root/u-root v0.12.0 h1:K0AuBFriwr0w/PGS3HawiAw89e3+MU7ks80GpghAsNs= github.com/u-root/u-root v0.12.0/go.mod h1:FYjTOh4IkIZHhjsd17lb8nYW6udgXdJhG1c0r6u0arI= github.com/uber-go/tally/v4 v4.1.10 h1:2GSX7Tmq26wjAvOtQEc5EvRROIkX2OX4vpROt6mlRLM= github.com/uber-go/tally/v4 v4.1.10/go.mod h1:pPR56rjthjtLB8xQlEx2I1VwAwRGCh/i4xMUcmG+6z4= +github.com/uptrace/bun v0.3.9/go.mod h1:aL6D9vPw8DXaTQTwGrEPtUderBYXx7ShUmPfnxnqscw= github.com/uptrace/bun v1.1.17 h1:qxBaEIo0hC/8O3O6GrMDKxqyT+mw5/s0Pn/n6xjyGIk= github.com/uptrace/bun v1.1.17/go.mod h1:hATAzivtTIRsSJR4B8AXR+uABqnQxr3myKDKEf5iQ9U= github.com/uptrace/bun/dialect/pgdialect v1.1.17 h1:NsvFVHAx1Az6ytlAD/B6ty3cVE6j9Yp82bjqd9R9hOs= github.com/uptrace/bun/dialect/pgdialect v1.1.17/go.mod h1:fLBDclNc7nKsZLzNjFL6BqSdgJzbj2HdnyOnLoDvAME= +github.com/uptrace/bun/dialect/sqlitedialect v1.1.17 h1:i8NFU9r8YuavNFaYlNqi4ppn+MgoHtqLgpWQDrVTjm0= +github.com/uptrace/bun/dialect/sqlitedialect v1.1.17/go.mod h1:YF0FO4VVnY9GHNH6rM4r3STlVEBxkOc6L88Bm5X5mzA= github.com/uptrace/bun/driver/pgdriver v1.1.17 h1:hLj6WlvSZk5x45frTQnJrYtyhvgI6CA4r7gYdJ0gpn8= github.com/uptrace/bun/driver/pgdriver v1.1.17/go.mod h1:c9fa6FiiQjOe9mCaJC9NmFUE6vCGKTEsqrtLjPNz+kk= +github.com/uptrace/bun/driver/sqliteshim v1.1.17 h1:Iye/NdURWx7JfzbMk+k5bhzWUkvTNLsdANb4aVCgQoU= +github.com/uptrace/bun/driver/sqliteshim v1.1.17/go.mod h1:ksjltqVfcPYYKYFbvgI+unY2H/IweDDLi6NCywq/ff0= github.com/uptrace/bun/extra/bundebug v1.1.17 h1:LcZ8DzyyGdXAmbUqmnCpBq7TPFegMp59FGy+uzEE21c= github.com/uptrace/bun/extra/bundebug v1.1.17/go.mod h1:FOwNaBEGGChv3qBVh3pz3TPlUuikZ93qKjd/LJdl91o= github.com/uptrace/bun/extra/bunotel v1.1.17 h1:RLEJdHH06RI9BLg06Vu1JHJ3KNHQCfwa2Fa3x+56qkk= @@ -445,6 +460,7 @@ github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.3/go.mod h1:jyigonKik3C5V github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vmihailenco/msgpack/v5 v5.3.4/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= @@ -493,8 +509,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= golang.org/x/exp/shiny v0.0.0-20240119083558-1b970713d09a h1:NZ9mAQhIcCceDZKqQX3JJVIz7nn3QLDuC+nXedsViBM= @@ -505,8 +521,8 @@ golang.org/x/mobile v0.0.0-20240112133503-c713f31d574b h1:kfWLZgb8iUBHdE9WydD5V5 golang.org/x/mobile v0.0.0-20240112133503-c713f31d574b/go.mod h1:4efzQnuA1nICq6h4kmZRMGzbPiP06lZvgADUu1VpJCE= 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.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= +golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -519,8 +535,8 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -529,8 +545,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-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -563,26 +579,26 @@ 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.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= +golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= +golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -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/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= +golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -631,3 +647,29 @@ gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= mellium.im/sasl v0.3.1 h1:wE0LW6g7U83vhvxjC1IY8DnXM+EU095yeo8XClvCdfo= mellium.im/sasl v0.3.1/go.mod h1:xm59PUYpZHhgQ9ZqoJ5QaCqzWMi8IeS49dhp6plPCzw= +modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ= +modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= +modernc.org/ccgo/v4 v4.21.0 h1:kKPI3dF7RIag8YcToh5ZwDcVMIv6VGa0ED5cvh0LMW4= +modernc.org/ccgo/v4 v4.21.0/go.mod h1:h6kt6H/A2+ew/3MW/p6KEoQmrq/i3pr0J/SiwiaF/g0= +modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= +modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= +modernc.org/gc/v2 v2.5.0 h1:bJ9ChznK1L1mUtAQtxi0wi5AtAs5jQuw4PrPHO5pb6M= +modernc.org/gc/v2 v2.5.0/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= +modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a h1:CfbpOLEo2IwNzJdMvE8aiRbPMxoTpgAJeyePh0SmO8M= +modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/libc v1.60.1 h1:at373l8IFRTkJIkAU85BIuUoBM4T1b51ds0E1ovPG2s= +modernc.org/libc v1.60.1/go.mod h1:xJuobKuNxKH3RUatS7GjR+suWj+5c2K7bi4m/S5arOY= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= +modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= +modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= +modernc.org/sqlite v1.32.0 h1:6BM4uGza7bWypsw4fdLRsLxut6bHe4c58VeqjRgST8s= +modernc.org/sqlite v1.32.0/go.mod h1:UqoylwmTb9F+IqXERT8bW9zzOWN8qwAIcLdzeBZs4hA= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=