Skip to content

Commit 57ca834

Browse files
committed
add _mutex flag to specify SQLITE_OPEN_NOMUTEX or SQLITE_OPEN_FULLMUTEX
1 parent 9101028 commit 57ca834

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

sqlite3.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,8 @@ func errorString(err Error) string {
783783
// Enable or disable enforcement of foreign keys. X can be 1 or 0.
784784
// _recursive_triggers=X
785785
// Enable or disable recursive triggers. X can be 1 or 0.
786+
// _mutex=XXX
787+
// Specify mutex mode. XXX can be "no", "full".
786788
func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
787789
if C.sqlite3_threadsafe() == 0 {
788790
return nil, errors.New("sqlite library was not compiled for thread-safe operation")
@@ -793,6 +795,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
793795
busyTimeout := 5000
794796
foreignKeys := -1
795797
recursiveTriggers := -1
798+
mutex := C.int(C.SQLITE_OPEN_FULLMUTEX)
796799
pos := strings.IndexRune(dsn, '?')
797800
if pos >= 1 {
798801
params, err := url.ParseQuery(dsn[pos+1:])
@@ -859,6 +862,18 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
859862
}
860863
}
861864

865+
// _mutex
866+
if val := params.Get("_mutex"); val != "" {
867+
switch val {
868+
case "no":
869+
mutex = C.SQLITE_OPEN_NOMUTEX
870+
case "full":
871+
mutex = C.SQLITE_OPEN_FULLMUTEX
872+
default:
873+
return nil, fmt.Errorf("Invalid _mutex: %v", val)
874+
}
875+
}
876+
862877
if !strings.HasPrefix(dsn, "file:") {
863878
dsn = dsn[:pos]
864879
}
@@ -868,9 +883,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
868883
name := C.CString(dsn)
869884
defer C.free(unsafe.Pointer(name))
870885
rv := C._sqlite3_open_v2(name, &db,
871-
C.SQLITE_OPEN_FULLMUTEX|
872-
C.SQLITE_OPEN_READWRITE|
873-
C.SQLITE_OPEN_CREATE,
886+
mutex|C.SQLITE_OPEN_READWRITE|C.SQLITE_OPEN_CREATE,
874887
nil)
875888
if rv != 0 {
876889
return nil, Error{Code: ErrNo(rv)}

0 commit comments

Comments
 (0)