@@ -25,8 +25,9 @@ const (
25
25
WHERE a.rolname = ANY($1)
26
26
ORDER BY 1;`
27
27
28
- getDatabasesSQL = `SELECT datname, a.rolname AS owner FROM pg_database d INNER JOIN pg_authid a ON a.oid = d.datdba;`
29
- createDatabaseSQL = `CREATE DATABASE "%s" OWNER "%s";`
28
+ getDatabasesSQL = `SELECT datname, pg_get_userbyid(datdba) AS owner FROM pg_database;`
29
+ createDatabaseSQL = `CREATE DATABASE "%s" OWNER "%s";`
30
+ alterDatabaseOwnerSQL = `ALTER DATABASE "%s" OWNER TO "%s";`
30
31
)
31
32
32
33
func (c * Cluster ) pgConnectionString () string {
@@ -137,22 +138,15 @@ func (c *Cluster) readPgUsersFromDatabase(userNames []string) (users spec.PgUser
137
138
return users , nil
138
139
}
139
140
141
+ // getDatabases returns the map of current databases with owners
142
+ // The caller is responsible for opening and closing the database connection
140
143
func (c * Cluster ) getDatabases () (map [string ]string , error ) {
141
144
var (
142
145
rows * sql.Rows
143
146
err error
144
147
)
145
148
dbs := make (map [string ]string )
146
149
147
- if err = c .initDbConn (); err != nil {
148
- return nil , fmt .Errorf ("could not init db connection" )
149
- }
150
- defer func () {
151
- if err = c .closeDbConn (); err != nil {
152
- c .logger .Errorf ("could not close db connection: %v" , err )
153
- }
154
- }()
155
-
156
150
if rows , err = c .pgDb .Query (getDatabasesSQL ); err != nil {
157
151
return nil , fmt .Errorf ("could not query database: %v" , err )
158
152
}
@@ -176,49 +170,44 @@ func (c *Cluster) getDatabases() (map[string]string, error) {
176
170
return dbs , nil
177
171
}
178
172
179
- func (c * Cluster ) createDatabases () error {
180
- c .setProcessName ("creating databases" )
181
-
182
- newDbs := c .Spec .Databases
183
- curDbs , err := c .getDatabases ()
184
- if err != nil {
185
- return fmt .Errorf ("could not get current databases: %v" , err )
173
+ // executeCreateDatabase creates new database with the given owner.
174
+ // The caller is responsible for openinging and closing the database connection.
175
+ func (c * Cluster ) executeCreateDatabase (datname , owner string ) error {
176
+ if ! c .databaseNameOwnerValid (datname , owner ) {
177
+ return nil
186
178
}
187
- for datname := range curDbs {
188
- delete (newDbs , datname )
179
+ c .logger .Infof ("creating database %q with owner %q" , datname , owner )
180
+
181
+ if _ , err := c .pgDb .Query (fmt .Sprintf (createDatabaseSQL , datname , owner )); err != nil {
182
+ return fmt .Errorf ("could not execute create database: %v" , err )
189
183
}
184
+ return nil
185
+ }
190
186
191
- if len (newDbs ) == 0 {
187
+ // executeCreateDatabase changes the owner of the given database.
188
+ // The caller is responsible for openinging and closing the database connection.
189
+ func (c * Cluster ) executeAlterDatabaseOwner (datname string , owner string ) error {
190
+ if ! c .databaseNameOwnerValid (datname , owner ) {
192
191
return nil
193
192
}
194
-
195
- if err = c .initDbConn ( ); err != nil {
196
- return fmt .Errorf ("could not init database connection" )
193
+ c . logger . Infof ( "changing database %q owner to %q" , datname , owner )
194
+ if _ , err : = c .pgDb . Query ( fmt . Sprintf ( alterDatabaseOwnerSQL , datname , owner ) ); err != nil {
195
+ return fmt .Errorf ("could not execute alter database owner: %v" , err )
197
196
}
198
- defer func () {
199
- if err = c .closeDbConn (); err != nil {
200
- c .logger .Errorf ("could not close database connection: %v" , err )
201
- }
202
- }()
203
-
204
- for datname , owner := range newDbs {
205
- if _ , ok := c .pgUsers [owner ]; ! ok {
206
- c .logger .Infof ("skipping creation of the %q database, user %q does not exist" , datname , owner )
207
- continue
208
- }
209
-
210
- if ! databaseNameRegexp .MatchString (datname ) {
211
- c .logger .Infof ("database %q has invalid name" , datname )
212
- continue
213
- }
214
- c .logger .Infof ("creating database %q with owner %q" , datname , owner )
197
+ return nil
198
+ }
215
199
216
- if _ , err = c .pgDb .Query (fmt .Sprintf (createDatabaseSQL , datname , owner )); err != nil {
217
- return fmt .Errorf ("could not query database: %v" , err )
218
- }
200
+ func (c * Cluster ) databaseNameOwnerValid (datname , owner string ) bool {
201
+ if _ , ok := c .pgUsers [owner ]; ! ok {
202
+ c .logger .Infof ("skipping creation of the %q database, user %q does not exist" , datname , owner )
203
+ return false
219
204
}
220
205
221
- return nil
206
+ if ! databaseNameRegexp .MatchString (datname ) {
207
+ c .logger .Infof ("database %q has invalid name" , datname )
208
+ return false
209
+ }
210
+ return true
222
211
}
223
212
224
213
func makeUserFlags (rolsuper , rolinherit , rolcreaterole , rolcreatedb , rolcanlogin bool ) (result []string ) {
0 commit comments