Skip to content

Commit a72efd6

Browse files
authored
Merge pull request #540 from mattn/open-mode
add _mutex flag to specify SQLITE_OPEN_NOMUTEX or SQLITE_OPEN_FULLMUTEX
2 parents 20a06cb + 57ca834 commit a72efd6

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
@@ -789,6 +789,8 @@ func errorString(err Error) string {
789789
// Enable or disable enforcement of foreign keys. X can be 1 or 0.
790790
// _recursive_triggers=X
791791
// Enable or disable recursive triggers. X can be 1 or 0.
792+
// _mutex=XXX
793+
// Specify mutex mode. XXX can be "no", "full".
792794
func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
793795
if C.sqlite3_threadsafe() == 0 {
794796
return nil, errors.New("sqlite library was not compiled for thread-safe operation")
@@ -799,6 +801,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
799801
busyTimeout := 5000
800802
foreignKeys := -1
801803
recursiveTriggers := -1
804+
mutex := C.int(C.SQLITE_OPEN_FULLMUTEX)
802805
pos := strings.IndexRune(dsn, '?')
803806
if pos >= 1 {
804807
params, err := url.ParseQuery(dsn[pos+1:])
@@ -865,6 +868,18 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
865868
}
866869
}
867870

871+
// _mutex
872+
if val := params.Get("_mutex"); val != "" {
873+
switch val {
874+
case "no":
875+
mutex = C.SQLITE_OPEN_NOMUTEX
876+
case "full":
877+
mutex = C.SQLITE_OPEN_FULLMUTEX
878+
default:
879+
return nil, fmt.Errorf("Invalid _mutex: %v", val)
880+
}
881+
}
882+
868883
if !strings.HasPrefix(dsn, "file:") {
869884
dsn = dsn[:pos]
870885
}
@@ -874,9 +889,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
874889
name := C.CString(dsn)
875890
defer C.free(unsafe.Pointer(name))
876891
rv := C._sqlite3_open_v2(name, &db,
877-
C.SQLITE_OPEN_FULLMUTEX|
878-
C.SQLITE_OPEN_READWRITE|
879-
C.SQLITE_OPEN_CREATE,
892+
mutex|C.SQLITE_OPEN_READWRITE|C.SQLITE_OPEN_CREATE,
880893
nil)
881894
if rv != 0 {
882895
return nil, Error{Code: ErrNo(rv)}

0 commit comments

Comments
 (0)