diff --git a/cmd/icingadb/main.go b/cmd/icingadb/main.go index 634de299..06449802 100644 --- a/cmd/icingadb/main.go +++ b/cmd/icingadb/main.go @@ -5,6 +5,7 @@ import ( "github.com/go-redis/redis/v8" "github.com/icinga/icingadb/internal/command" "github.com/icinga/icingadb/pkg/common" + "github.com/icinga/icingadb/pkg/driver" "github.com/icinga/icingadb/pkg/icingadb" "github.com/icinga/icingadb/pkg/icingadb/history" "github.com/icinga/icingadb/pkg/icingadb/overdue" @@ -320,9 +321,9 @@ func run() int { func checkDbSchema(ctx context.Context, db *icingadb.DB) error { var expectedDbSchemaVersion uint16 switch db.DriverName() { - case "icingadb-mysql": + case driver.MySQL: expectedDbSchemaVersion = expectedMysqlSchemaVersion - case "icingadb-pgsql": + case driver.PostgreSQL: expectedDbSchemaVersion = expectedPostgresSchemaVersion } diff --git a/pkg/driver/driver.go b/pkg/driver/driver.go index eb96cf3b..f86e37f0 100644 --- a/pkg/driver/driver.go +++ b/pkg/driver/driver.go @@ -15,6 +15,9 @@ import ( "time" ) +const MySQL = "icingadb-mysql" +const PostgreSQL = "icingadb-pgsql" + var timeout = time.Minute * 5 // RetryConnector wraps driver.Connector with retry logic. @@ -78,10 +81,10 @@ func (d Driver) OpenConnector(name string) (driver.Connector, error) { // Register makes our database Driver available under the name "icingadb-*sql". func Register(logger *logging.Logger) { - sql.Register("icingadb-mysql", &Driver{ctxDriver: &mysql.MySQLDriver{}, Logger: logger}) - sql.Register("icingadb-pgsql", &Driver{ctxDriver: PgSQLDriver{}, Logger: logger}) + sql.Register(MySQL, &Driver{ctxDriver: &mysql.MySQLDriver{}, Logger: logger}) + sql.Register(PostgreSQL, &Driver{ctxDriver: PgSQLDriver{}, Logger: logger}) _ = mysql.SetLogger(mysqlLogger(func(v ...interface{}) { logger.Debug(v...) })) - sqlx.BindDriver("icingadb-pgsql", sqlx.DOLLAR) + sqlx.BindDriver(PostgreSQL, sqlx.DOLLAR) } // ctxDriver helps ensure that we only support drivers that implement driver.Driver and driver.DriverContext. diff --git a/pkg/icingadb/db.go b/pkg/icingadb/db.go index 3a440046..500d0e39 100644 --- a/pkg/icingadb/db.go +++ b/pkg/icingadb/db.go @@ -2,13 +2,14 @@ package icingadb import ( "context" - "database/sql/driver" + sqlDriver "database/sql/driver" "fmt" "github.com/go-sql-driver/mysql" "github.com/icinga/icingadb/internal" "github.com/icinga/icingadb/pkg/backoff" "github.com/icinga/icingadb/pkg/com" "github.com/icinga/icingadb/pkg/contracts" + "github.com/icinga/icingadb/pkg/driver" "github.com/icinga/icingadb/pkg/logging" "github.com/icinga/icingadb/pkg/periodic" "github.com/icinga/icingadb/pkg/retry" @@ -128,10 +129,10 @@ func (db *DB) BuildInsertIgnoreStmt(into interface{}) (string, int) { var clause string switch db.DriverName() { - case "icingadb-mysql": + case driver.MySQL: // MySQL treats UPDATE id = id as a no-op. clause = "ON DUPLICATE KEY UPDATE id = id" - case "icingadb-pgsql": + case driver.PostgreSQL: clause = fmt.Sprintf("ON CONFLICT ON CONSTRAINT pk_%s DO NOTHING", table) } @@ -191,10 +192,10 @@ func (db *DB) BuildUpsertStmt(subject interface{}) (stmt string, placeholders in var clause, setFormat string switch db.DriverName() { - case "icingadb-mysql": + case driver.MySQL: clause = "ON DUPLICATE KEY UPDATE" setFormat = "%[1]s = VALUES(%[1]s)" - case "icingadb-pgsql": + case driver.PostgreSQL: clause = fmt.Sprintf("ON CONFLICT ON CONSTRAINT pk_%s DO UPDATE SET", table) setFormat = "%[1]s = EXCLUDED.%[1]s" } @@ -584,7 +585,7 @@ func (db *DB) log(ctx context.Context, query string, counter *com.Counter) perio // IsRetryable checks whether the given error is retryable. func IsRetryable(err error) bool { - if errors.Is(err, driver.ErrBadConn) { + if errors.Is(err, sqlDriver.ErrBadConn) { return true }