diff options
author | Yasuhiro Matsumoto <mattn.jp@gmail.com> | 2018-12-07 15:47:27 +0900 |
---|---|---|
committer | Yasuhiro Matsumoto <mattn.jp@gmail.com> | 2018-12-07 16:07:16 +0900 |
commit | 03b96a53baf1987fe52b653ce0d1817e549259b8 (patch) | |
tree | 5b93db19f7703f7fdb8f3a277494e4d7e921b5a6 | |
parent | Merge pull request #670 from mattn/close-db (diff) | |
download | golite-03b96a53baf1987fe52b653ce0d1817e549259b8.tar.gz golite-03b96a53baf1987fe52b653ce0d1817e549259b8.tar.xz |
SQLITE_OPEN_CREATE should be specified for sqlite3_open_v2 if mode is not rw
Fixes #667
Fixes #669
-rw-r--r-- | sqlite3.go | 22 |
1 files changed, 16 insertions, 6 deletions
@@ -990,7 +990,6 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { authPass := "" authCrypt := "" authSalt := "" - mutex := C.int(C.SQLITE_OPEN_FULLMUTEX) txlock := "BEGIN" // PRAGMA's @@ -1007,6 +1006,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { secureDelete := "DEFAULT" synchronousMode := "NORMAL" writableSchema := -1 + flags := C.SQLITE_OPEN_READWRITE | C.SQLITE_OPEN_CREATE | C.SQLITE_OPEN_FULLMUTEX pos := strings.IndexRune(dsn, '?') if pos >= 1 { @@ -1015,6 +1015,17 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { return nil, err } + if val := params.Get("mode"); val != "" { + switch val { + case "ro": + flags |= C.SQLITE_OPEN_READONLY + case "rw": + flags ^= C.SQLITE_OPEN_CREATE + case "rwc": + flags |= C.SQLITE_OPEN_CREATE + } + } + // Authentication if _, ok := params["_auth"]; ok { authCreate = true @@ -1049,9 +1060,9 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { if val := params.Get("_mutex"); val != "" { switch strings.ToLower(val) { case "no": - mutex = C.SQLITE_OPEN_NOMUTEX + flags |= C.SQLITE_OPEN_NOMUTEX case "full": - mutex = C.SQLITE_OPEN_FULLMUTEX + flags |= C.SQLITE_OPEN_FULLMUTEX default: return nil, fmt.Errorf("Invalid _mutex: %v", val) } @@ -1338,9 +1349,8 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { var db *C.sqlite3 name := C.CString(dsn) defer C.free(unsafe.Pointer(name)) - rv := C._sqlite3_open_v2(name, &db, - mutex|C.SQLITE_OPEN_READWRITE|C.SQLITE_OPEN_CREATE, - nil) + + rv := C._sqlite3_open_v2(name, &db, C.int(flags), nil) if rv != 0 { if db != nil { C.sqlite3_close_v2(db) |