@ -1,7 +1,9 @@
package postgresql
import (
"bytes"
"database/sql"
"errors"
"fmt"
"log"
@ -10,21 +12,33 @@ import (
"github.com/lib/pq"
)
const (
extNameAttr = "name"
extSchemaAttr = "schema"
)
func resourcePostgreSQLExtension ( ) * schema . Resource {
return & schema . Resource {
Create : resourcePostgreSQLExtensionCreate ,
Read : resourcePostgreSQLExtensionRead ,
Update : resourcePostgreSQLExtensionUpdate ,
Delete : resourcePostgreSQLExtensionDelete ,
Importer : & schema . ResourceImporter {
State : schema . ImportStatePassthrough ,
} ,
Schema : map [ string ] * schema . Schema {
"name" : {
extNameAttr : {
Type : schema . TypeString ,
Required : true ,
ForceNew : true ,
} ,
extSchemaAttr : {
Type : schema . TypeString ,
Optional : true ,
Computed : true ,
Description : "Sets the schema of an extension" ,
} ,
} ,
}
}
@ -37,15 +51,22 @@ func resourcePostgreSQLExtensionCreate(d *schema.ResourceData, meta interface{})
}
defer conn . Close ( )
extensionName := d . Get ( "name" ) . ( string )
extName := d . Get ( extNameAttr ) . ( string )
b := bytes . NewBufferString ( "CREATE EXTENSION " )
fmt . Fprintf ( b , pq . QuoteIdentifier ( extName ) )
query := fmt . Sprintf ( "CREATE EXTENSION %s" , pq . QuoteIdentifier ( extensionName ) )
if v , ok := d . GetOk ( extSchemaAttr ) ; ok {
fmt . Fprint ( b , " SCHEMA " , pq . QuoteIdentifier ( v . ( string ) ) )
}
query := b . String ( )
_ , err = conn . Query ( query )
if err != nil {
return errwrap . Wrapf ( "Error creating extension: {{err}}" , err )
}
d . SetId ( ext ension Name)
d . SetId ( ext Name)
return resourcePostgreSQLExtensionRead ( d , meta )
}
@ -58,11 +79,10 @@ func resourcePostgreSQLExtensionRead(d *schema.ResourceData, meta interface{}) e
}
defer conn . Close ( )
dbId := d . Id ( )
extensionName := d . Get ( "name" ) . ( string )
extID := d . Get ( extNameAttr ) . ( string )
var hasExtension bool
err = conn . QueryRow ( "SELECT TRUE from pg_catalog.pg_extension d WHERE extname=$1", dbId ) . Scan ( & hasExtension )
var extName, extSchema string
err = conn . QueryRow ( "SELECT e.extname, n.nspname FROM pg_catalog.pg_extension e, pg_catalog.pg_namespace n WHERE n.oid = e.extnamespace AND e.extname = $1", extID ) . Scan ( & extName , & extSchema )
switch {
case err == sql . ErrNoRows :
log . Printf ( "[WARN] PostgreSQL extension (%s) not found" , d . Id ( ) )
@ -71,8 +91,9 @@ func resourcePostgreSQLExtensionRead(d *schema.ResourceData, meta interface{}) e
case err != nil :
return errwrap . Wrapf ( "Error reading extension: {{err}}" , err )
default :
d . Set ( "extension" , hasExtension )
d . SetId ( extensionName )
d . Set ( extNameAttr , extName )
d . Set ( extSchemaAttr , extSchema )
d . SetId ( extName )
return nil
}
}
@ -85,9 +106,9 @@ func resourcePostgreSQLExtensionDelete(d *schema.ResourceData, meta interface{})
}
defer conn . Close ( )
ext ension Name := d . Get ( "name" ) . ( string )
ext Name := d . Get ( extNameAttr ) . ( string )
query := fmt . Sprintf ( "DROP EXTENSION %s" , pq . QuoteIdentifier ( ext ension Name) )
query := fmt . Sprintf ( "DROP EXTENSION %s" , pq . QuoteIdentifier ( ext Name) )
_ , err = conn . Query ( query )
if err != nil {
return errwrap . Wrapf ( "Error deleting extension: {{err}}" , err )
@ -97,3 +118,40 @@ func resourcePostgreSQLExtensionDelete(d *schema.ResourceData, meta interface{})
return nil
}
func resourcePostgreSQLExtensionUpdate ( d * schema . ResourceData , meta interface { } ) error {
c := meta . ( * Client )
conn , err := c . Connect ( )
if err != nil {
return err
}
defer conn . Close ( )
// Can't rename a schema
if err := setExtSchema ( conn , d ) ; err != nil {
return err
}
return resourcePostgreSQLExtensionRead ( d , meta )
}
func setExtSchema ( conn * sql . DB , d * schema . ResourceData ) error {
if ! d . HasChange ( extSchemaAttr ) {
return nil
}
oraw , nraw := d . GetChange ( extSchemaAttr )
o := oraw . ( string )
n := nraw . ( string )
if n == "" {
return errors . New ( "Error setting extension name to an empty string" )
}
query := fmt . Sprintf ( "ALTER EXTENSION %s SET SCHEMA %s" , pq . QuoteIdentifier ( o ) , pq . QuoteIdentifier ( n ) )
if _ , err := conn . Query ( query ) ; err != nil {
return errwrap . Wrapf ( "Error updating extension SCHEMA: {{err}}" , err )
}
return nil
}