aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormattn <mattn.jp@gmail.com>2018-04-19 16:32:57 +0900
committerGitHub <noreply@github.com>2018-04-19 16:32:57 +0900
commita72efd674f654961a11ac41aae72c0e43963fe6c (patch)
tree4ce8e6ea38c45a61d88001dc1d0dd3e79acb128d
parentMerge pull request #552 from mattn/disable-pread64-android (diff)
parentadd _mutex flag to specify SQLITE_OPEN_NOMUTEX or SQLITE_OPEN_FULLMUTEX (diff)
downloadgolite-a72efd674f654961a11ac41aae72c0e43963fe6c.tar.gz
golite-a72efd674f654961a11ac41aae72c0e43963fe6c.tar.xz
Merge pull request #540 from mattn/open-mode
add _mutex flag to specify SQLITE_OPEN_NOMUTEX or SQLITE_OPEN_FULLMUTEX
-rw-r--r--sqlite3.go19
1 files changed, 16 insertions, 3 deletions
diff --git a/sqlite3.go b/sqlite3.go
index 683562d..2edeb2f 100644
--- a/sqlite3.go
+++ b/sqlite3.go
@@ -789,6 +789,8 @@ func errorString(err Error) string {
// 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.
+// _mutex=XXX
+// Specify mutex mode. XXX can be "no", "full".
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")
@@ -799,6 +801,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
busyTimeout := 5000
foreignKeys := -1
recursiveTriggers := -1
+ mutex := C.int(C.SQLITE_OPEN_FULLMUTEX)
pos := strings.IndexRune(dsn, '?')
if pos >= 1 {
params, err := url.ParseQuery(dsn[pos+1:])
@@ -865,6 +868,18 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
}
}
+ // _mutex
+ if val := params.Get("_mutex"); val != "" {
+ switch val {
+ case "no":
+ mutex = C.SQLITE_OPEN_NOMUTEX
+ case "full":
+ mutex = C.SQLITE_OPEN_FULLMUTEX
+ default:
+ return nil, fmt.Errorf("Invalid _mutex: %v", val)
+ }
+ }
+
if !strings.HasPrefix(dsn, "file:") {
dsn = dsn[:pos]
}
@@ -874,9 +889,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
name := C.CString(dsn)
defer C.free(unsafe.Pointer(name))
rv := C._sqlite3_open_v2(name, &db,
- C.SQLITE_OPEN_FULLMUTEX|
- C.SQLITE_OPEN_READWRITE|
- C.SQLITE_OPEN_CREATE,
+ mutex|C.SQLITE_OPEN_READWRITE|C.SQLITE_OPEN_CREATE,
nil)
if rv != 0 {
return nil, Error{Code: ErrNo(rv)}