Skip to content

Commit

Permalink
Added error return to ConnectHook and fixed extension example
Browse files Browse the repository at this point in the history
The ConnectHook field of an SQLiteDriver should return an error in
case something bad happened during the hook.

The extension example needs to load the extension in a ConnectHook,
otherwise the extension is only loaded in a single connection in the pool.
By putting the extension loading in the ConnectHook, its called for every
connection that is opened by the sql.DB.
  • Loading branch information
cookieo9 committed Aug 25, 2013
1 parent 248e51c commit 976f438
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 4 deletions.
34 changes: 32 additions & 2 deletions example/extension/extension.go
Expand Up @@ -8,10 +8,30 @@ import (
)

func main() {
const (
use_hook = true
load_query = "SELECT load_extension('sqlite3_mod_regexp.dll')"
)

sql.Register("sqlite3_with_extensions",
&sqlite3.SQLiteDriver{
EnableLoadExtension: true,
ConnectHook: nil,
ConnectHook: func(c *sqlite3.SQLiteConn) error {
if use_hook {
stmt, err := c.Prepare(load_query)
if err != nil {
return err
}

_, err = stmt.Exec(nil)
if err != nil {
return err
}

return stmt.Close()
}
return nil
},
})

db, err := sql.Open("sqlite3_with_extensions", ":memory:")
Expand All @@ -20,11 +40,21 @@ func main() {
}
defer db.Close()

_, err = db.Exec("select load_extension('sqlite3_mod_regexp.dll')")
if !use_hook {
if _, err = db.Exec(load_query); err != nil {
log.Fatal(err)
}
}

// Force db to make a new connection in pool
// by putting the original in a transaction
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
defer tx.Commit()

// New connection works (hopefully!)
rows, err := db.Query("select 'hello world' where 'hello world' regexp '^hello.*d$'")
if err != nil {
log.Fatal(err)
Expand Down
6 changes: 4 additions & 2 deletions sqlite3.go
Expand Up @@ -78,7 +78,7 @@ func init() {
// Driver struct.
type SQLiteDriver struct {
EnableLoadExtension bool
ConnectHook func(*SQLiteConn)
ConnectHook func(*SQLiteConn) error
}

// Conn struct.
Expand Down Expand Up @@ -194,7 +194,9 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
conn := &SQLiteConn{db}

if d.ConnectHook != nil {
d.ConnectHook(conn)
if err := d.ConnectHook(conn); err != nil {
return nil, err
}
}

return conn, nil
Expand Down

0 comments on commit 976f438

Please sign in to comment.