@@ -38,6 +38,7 @@ func resourcePostgreSQLRole() *schema.Resource {
3838 Read : resourcePostgreSQLRoleRead ,
3939 Update : resourcePostgreSQLRoleUpdate ,
4040 Delete : resourcePostgreSQLRoleDelete ,
41+ Exists : resourcePostgreSQLRoleExists ,
4142 Importer : & schema.ResourceImporter {
4243 State : schema .ImportStatePassthrough ,
4344 },
@@ -140,6 +141,9 @@ func resourcePostgreSQLRole() *schema.Resource {
140141
141142func resourcePostgreSQLRoleCreate (d * schema.ResourceData , meta interface {}) error {
142143 c := meta .(* Client )
144+ c .catalogLock .Lock ()
145+ defer c .catalogLock .Unlock ()
146+
143147 conn , err := c .Connect ()
144148 if err != nil {
145149 return errwrap .Wrapf ("Error connecting to PostgreSQL: {{err}}" , err )
@@ -243,12 +247,15 @@ func resourcePostgreSQLRoleCreate(d *schema.ResourceData, meta interface{}) erro
243247
244248 d .SetId (roleName )
245249
246- return resourcePostgreSQLRoleRead (d , meta )
250+ return resourcePostgreSQLRoleReadImpl (d , meta )
247251}
248252
249253func resourcePostgreSQLRoleDelete (d * schema.ResourceData , meta interface {}) error {
250- client := meta .(* Client )
251- conn , err := client .Connect ()
254+ c := meta .(* Client )
255+ c .catalogLock .Lock ()
256+ defer c .catalogLock .Unlock ()
257+
258+ conn , err := c .Connect ()
252259 if err != nil {
253260 return err
254261 }
@@ -290,7 +297,38 @@ func resourcePostgreSQLRoleDelete(d *schema.ResourceData, meta interface{}) erro
290297 return nil
291298}
292299
300+ func resourcePostgreSQLRoleExists (d * schema.ResourceData , meta interface {}) (bool , error ) {
301+ c := meta .(* Client )
302+ c .catalogLock .RLock ()
303+ defer c .catalogLock .RUnlock ()
304+
305+ conn , err := c .Connect ()
306+ if err != nil {
307+ return false , err
308+ }
309+ defer conn .Close ()
310+
311+ var roleName string
312+ err = conn .QueryRow ("SELECT rolname FROM pg_catalog.pg_roles WHERE rolname=$1" , d .Id ()).Scan (& roleName )
313+ switch {
314+ case err == sql .ErrNoRows :
315+ return false , nil
316+ case err != nil :
317+ return false , err
318+ }
319+
320+ return true , nil
321+ }
322+
293323func resourcePostgreSQLRoleRead (d * schema.ResourceData , meta interface {}) error {
324+ c := meta .(* Client )
325+ c .catalogLock .RLock ()
326+ defer c .catalogLock .RUnlock ()
327+
328+ return resourcePostgreSQLRoleReadImpl (d , meta )
329+ }
330+
331+ func resourcePostgreSQLRoleReadImpl (d * schema.ResourceData , meta interface {}) error {
294332 c := meta .(* Client )
295333 conn , err := c .Connect ()
296334 if err != nil {
@@ -347,6 +385,9 @@ func resourcePostgreSQLRoleRead(d *schema.ResourceData, meta interface{}) error
347385
348386func resourcePostgreSQLRoleUpdate (d * schema.ResourceData , meta interface {}) error {
349387 c := meta .(* Client )
388+ c .catalogLock .Lock ()
389+ defer c .catalogLock .Unlock ()
390+
350391 conn , err := c .Connect ()
351392 if err != nil {
352393 return err
@@ -393,7 +434,7 @@ func resourcePostgreSQLRoleUpdate(d *schema.ResourceData, meta interface{}) erro
393434 return err
394435 }
395436
396- return resourcePostgreSQLRoleRead (d , meta )
437+ return resourcePostgreSQLRoleReadImpl (d , meta )
397438}
398439
399440func setRoleName (conn * sql.DB , d * schema.ResourceData ) error {
0 commit comments