doc.go: you can use Conn.Raw to get *SQLiteConn (#882)
This can be easier that registering a new driver, in some cases. Add a test to verify that this works.move-code
parent
784c625194
commit
4f7abea96e
16
doc.go
16
doc.go
|
@ -79,9 +79,8 @@ Then, you can use this extension.
|
||||||
|
|
||||||
Connection Hook
|
Connection Hook
|
||||||
|
|
||||||
You can hook and inject your code when the connection is established. database/sql
|
You can hook and inject your code when the connection is established by setting
|
||||||
doesn't provide a way to get native go-sqlite3 interfaces. So if you want,
|
ConnectHook to get the SQLiteConn.
|
||||||
you need to set ConnectHook and get the SQLiteConn.
|
|
||||||
|
|
||||||
sql.Register("sqlite3_with_hook_example",
|
sql.Register("sqlite3_with_hook_example",
|
||||||
&sqlite3.SQLiteDriver{
|
&sqlite3.SQLiteDriver{
|
||||||
|
@ -91,6 +90,17 @@ you need to set ConnectHook and get the SQLiteConn.
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
You can also use database/sql.Conn.Raw:
|
||||||
|
|
||||||
|
conn, err := db.Conn(context.Background())
|
||||||
|
// if err != nil { ... }
|
||||||
|
defer conn.Close()
|
||||||
|
err = conn.Raw(func (driverConn interface{}) error {
|
||||||
|
sqliteConn := driverConn.(*sqlite3.SQLiteConn)
|
||||||
|
// ... use sqliteConn
|
||||||
|
})
|
||||||
|
// if err != nil { ... }
|
||||||
|
|
||||||
Go SQlite3 Extensions
|
Go SQlite3 Extensions
|
||||||
|
|
||||||
If you want to register Go functions as SQLite extension functions
|
If you want to register Go functions as SQLite extension functions
|
||||||
|
|
|
@ -9,6 +9,7 @@ package sqlite3
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"context"
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"database/sql/driver"
|
"database/sql/driver"
|
||||||
"errors"
|
"errors"
|
||||||
|
@ -2352,3 +2353,32 @@ func benchmarkStmtRows(b *testing.B) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestConnRawIsSQLiteConn(t *testing.T) {
|
||||||
|
db, err := sql.Open("sqlite3", ":memory:")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("Failed to open db:", err)
|
||||||
|
}
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
conn, err := db.Conn(context.Background())
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("Failed to get conn:", err)
|
||||||
|
}
|
||||||
|
defer conn.Close()
|
||||||
|
err = conn.Raw(func(driverConn interface{}) error {
|
||||||
|
sqliteConn, ok := driverConn.(*SQLiteConn)
|
||||||
|
if !ok {
|
||||||
|
t.Errorf("driverConn type=%T; expected to be *SQLiteConn", driverConn)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
// call a private SQLite API to confirm the raw conn "works"
|
||||||
|
if sqliteConn.AuthEnabled() {
|
||||||
|
t.Error("sqliteConn.AuthEnabled()=true; expected false")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Error("conn.Raw() returned err:", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue