From b3e6e047ad1557019b79436329dca88cdb3ca5b9 Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Fri, 3 Nov 2023 20:47:55 +0100 Subject: [PATCH] Bugfix? create pgql database if not exists With the current master branch code (commit afb2121bb0d8c2e079f90f7d3a1b1a2c3338bfa1) I see the following error: root@vm2:/home/vagrant# kine --debug --endpoint postgres://postgres:postgresql@localhost:5432/foobster INFO[2023-11-03T20:07:09.379099258Z] metrics server is starting to listen at :8080 INFO[2023-11-03T20:07:09.379709686Z] starting metrics server path /metrics FATA[2023-11-03T20:07:09.40247106Z] building kine: failed to connect to `host=localhost user=postgres database=foobster`: server error (FATAL: database "foobster" does not exist (SQLSTATE 3D000)) This is fixed with the current commit. Signed-off-by: Oz Tiram --- pkg/drivers/pgsql/pgsql.go | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/pkg/drivers/pgsql/pgsql.go b/pkg/drivers/pgsql/pgsql.go index d3524272..915df7c4 100644 --- a/pkg/drivers/pgsql/pgsql.go +++ b/pkg/drivers/pgsql/pgsql.go @@ -134,34 +134,28 @@ func createDBIfNotExist(dataSourceName string) error { } dbName := strings.SplitN(u.Path, "/", 2)[1] - db, err := sql.Open("pgx", dataSourceName) + u.Path = "/postgres" + db, err := sql.Open("pgx", u.String()) if err != nil { return err } defer db.Close() - err = db.Ping() - // check if database already exists - if _, ok := err.(*pgconn.PgError); !ok { + var exists bool + err = db.QueryRow("SELECT 1 FROM pg_database WHERE datname = $1", dbName).Scan(&exists) + if err != nil && err != sql.ErrNoRows { return err } - if err := err.(*pgconn.PgError); err.Code != pgerrcode.DuplicateDatabase { - if err.Code != pgerrcode.InvalidCatalogName { - return err - } - // database doesn't exit, will try to create it - u.Path = "/postgres" - db, err := sql.Open("pgx", u.String()) - if err != nil { - return err - } - defer db.Close() - stmt := createDB + dbName + ";" + + stmt := createDB + dbName + ";" + + if !exists { logrus.Tracef("SETUP EXEC : %v", util.Stripped(stmt)) _, err = db.Exec(stmt) if err != nil { return err } + logrus.Tracef("created database: %s", dbName) } return nil }