aboutsummaryrefslogtreecommitdiff
path: root/sqlite3.go
diff options
context:
space:
mode:
authormattn <mattn.jp@gmail.com>2017-07-10 23:00:56 +0900
committerGitHub <noreply@github.com>2017-07-10 23:00:56 +0900
commit47fc4e5e9153645da45af6a86a5bce95e63a0f9e (patch)
tree5be4e9032b77556103b40a50cfdbca09abda4d73 /sqlite3.go
parentMerge pull request #434 from toba/master (diff)
parentAdd connection option for recursive triggers (diff)
downloadgolite-47fc4e5e9153645da45af6a86a5bce95e63a0f9e.tar.gz
golite-47fc4e5e9153645da45af6a86a5bce95e63a0f9e.tar.xz
Merge pull request #436 from zombiezen/recursivetriggers
Add connection option for recursive triggers
Diffstat (limited to 'sqlite3.go')
-rw-r--r--sqlite3.go26
1 files changed, 26 insertions, 0 deletions
diff --git a/sqlite3.go b/sqlite3.go
index 2b7b8df..2ebf7e7 100644
--- a/sqlite3.go
+++ b/sqlite3.go
@@ -599,6 +599,8 @@ func errorString(err Error) string {
// "deferred", "exclusive".
// _foreign_keys=X
// Enable or disable enforcement of foreign keys. X can be 1 or 0.
+// _recursive_triggers=X
+// Enable or disable recursive triggers. X can be 1 or 0.
func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
if C.sqlite3_threadsafe() == 0 {
return nil, errors.New("sqlite library was not compiled for thread-safe operation")
@@ -608,6 +610,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
txlock := "BEGIN"
busyTimeout := 5000
foreignKeys := -1
+ recursiveTriggers := -1
pos := strings.IndexRune(dsn, '?')
if pos >= 1 {
params, err := url.ParseQuery(dsn[pos+1:])
@@ -662,6 +665,18 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
}
}
+ // _recursive_triggers
+ if val := params.Get("_recursive_triggers"); val != "" {
+ switch val {
+ case "1":
+ recursiveTriggers = 1
+ case "0":
+ recursiveTriggers = 0
+ default:
+ return nil, fmt.Errorf("Invalid _recursive_triggers: %v", val)
+ }
+ }
+
if !strings.HasPrefix(dsn, "file:") {
dsn = dsn[:pos]
}
@@ -708,6 +723,17 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
return nil, err
}
}
+ if recursiveTriggers == 0 {
+ if err := exec("PRAGMA recursive_triggers = OFF;"); err != nil {
+ C.sqlite3_close_v2(db)
+ return nil, err
+ }
+ } else if recursiveTriggers == 1 {
+ if err := exec("PRAGMA recursive_triggers = ON;"); err != nil {
+ C.sqlite3_close_v2(db)
+ return nil, err
+ }
+ }
conn := &SQLiteConn{db: db, loc: loc, txlock: txlock}