Skip to content

Commit a4e44c7

Browse files
authored
Refactor GetConnection to be able to get the pq error code of the error (#72)
1 parent 7ef05da commit a4e44c7

File tree

4 files changed

+35
-15
lines changed

4 files changed

+35
-15
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ tags
7676
.history
7777
# End of https://www.gitignore.io/api/go,vim,emacs,visualstudiocode
7878

79+
### MacOS
80+
.DS_Store
81+
7982
.idea
8083
deploy/secret.yaml
8184
# build artifact

pkg/postgres/database.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,13 @@ func (c *pg) CreateDB(dbname, role string) error {
3535
}
3636

3737
func (c *pg) CreateSchema(db, role, schema string, logger logr.Logger) error {
38-
tmpDb := GetConnection(c.user, c.pass, c.host, db, c.args, logger)
38+
tmpDb, err := GetConnection(c.user, c.pass, c.host, db, c.args, logger)
39+
if err != nil {
40+
return err
41+
}
3942
defer tmpDb.Close()
4043

41-
_, err := tmpDb.Exec(fmt.Sprintf(CREATE_SCHEMA, schema, role))
44+
_, err = tmpDb.Exec(fmt.Sprintf(CREATE_SCHEMA, schema, role))
4245
if err != nil {
4346
return err
4447
}
@@ -58,22 +61,28 @@ func (c *pg) DropDatabase(database string, logger logr.Logger) error {
5861
}
5962

6063
func (c *pg) CreateExtension(db, extension string, logger logr.Logger) error {
61-
tmpDb := GetConnection(c.user, c.pass, c.host, db, c.args, logger)
64+
tmpDb, err := GetConnection(c.user, c.pass, c.host, db, c.args, logger)
65+
if err != nil {
66+
return err
67+
}
6268
defer tmpDb.Close()
6369

64-
_, err := tmpDb.Exec(fmt.Sprintf(CREATE_EXTENSION, extension))
70+
_, err = tmpDb.Exec(fmt.Sprintf(CREATE_EXTENSION, extension))
6571
if err != nil {
6672
return err
6773
}
6874
return nil
6975
}
7076

7177
func (c *pg) SetSchemaPrivileges(db, creator, role, schema, privs string, logger logr.Logger) error {
72-
tmpDb := GetConnection(c.user, c.pass, c.host, db, c.args, logger)
78+
tmpDb, err := GetConnection(c.user, c.pass, c.host, db, c.args, logger)
79+
if err != nil {
80+
return err
81+
}
7382
defer tmpDb.Close()
7483

7584
// Grant role usage on schema
76-
_, err := tmpDb.Exec(fmt.Sprintf(GRANT_USAGE_SCHEMA, schema, role))
85+
_, err = tmpDb.Exec(fmt.Sprintf(GRANT_USAGE_SCHEMA, schema, role))
7786
if err != nil {
7887
return err
7988
}

pkg/postgres/postgres.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,13 @@ type pg struct {
3636
}
3737

3838
func NewPG(host, user, password, uri_args, default_database, cloud_type string, logger logr.Logger) (PG, error) {
39+
db, err := GetConnection(user, password, host, default_database, uri_args, logger)
40+
if err != nil {
41+
log.Fatalf("failed to connect to PostgreSQL server: %s", err.Error())
42+
}
43+
logger.Info("connected to postgres server")
3944
postgres := &pg{
40-
db: GetConnection(user, password, host, default_database, uri_args, logger),
45+
db: db,
4146
log: logger,
4247
host: host,
4348
user: user,
@@ -64,15 +69,11 @@ func (c *pg) GetDefaultDatabase() string {
6469
return c.default_database
6570
}
6671

67-
func GetConnection(user, password, host, database, uri_args string, logger logr.Logger) *sql.DB {
72+
func GetConnection(user, password, host, database, uri_args string, logger logr.Logger) (*sql.DB, error) {
6873
db, err := sql.Open("postgres", fmt.Sprintf("postgresql://%s:%s@%s/%s?%s", user, password, host, database, uri_args))
6974
if err != nil {
7075
log.Fatal(err)
7176
}
7277
err = db.Ping()
73-
if err != nil {
74-
log.Fatalf("failed to connect to PostgreSQL server: %s", err.Error())
75-
}
76-
logger.Info("connected to postgres server")
77-
return db
78+
return db, err
7879
}

pkg/postgres/role.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,15 @@ func (c *pg) RevokeRole(role, revoked string) error {
6262

6363
func (c *pg) DropRole(role, newOwner, database string, logger logr.Logger) error {
6464
// REASSIGN OWNED BY only works if the correct database is selected
65-
tmpDb := GetConnection(c.user, c.pass, c.host, database, c.args, logger)
66-
_, err := tmpDb.Exec(fmt.Sprintf(REASIGN_OBJECTS, role, newOwner))
65+
tmpDb, err := GetConnection(c.user, c.pass, c.host, database, c.args, logger)
66+
if err != nil {
67+
if err.(*pq.Error).Code == "3D000" {
68+
return nil // Database is does not exist (anymore)
69+
} else {
70+
return err
71+
}
72+
}
73+
_, err = tmpDb.Exec(fmt.Sprintf(REASIGN_OBJECTS, role, newOwner))
6774
defer tmpDb.Close()
6875
// Check if error exists and if different from "ROLE NOT FOUND" => 42704
6976
if err != nil && err.(*pq.Error).Code != "42704" {

0 commit comments

Comments
 (0)