SQLITE_OPEN_CREATE should be specified for sqlite3_open_v2 if mode is not rw
Fixes #667 Fixes #669fix-688
parent
e924752105
commit
03b96a53ba
22
sqlite3.go
22
sqlite3.go
|
@ -990,7 +990,6 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
|
||||||
authPass := ""
|
authPass := ""
|
||||||
authCrypt := ""
|
authCrypt := ""
|
||||||
authSalt := ""
|
authSalt := ""
|
||||||
mutex := C.int(C.SQLITE_OPEN_FULLMUTEX)
|
|
||||||
txlock := "BEGIN"
|
txlock := "BEGIN"
|
||||||
|
|
||||||
// PRAGMA's
|
// PRAGMA's
|
||||||
|
@ -1007,6 +1006,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
|
||||||
secureDelete := "DEFAULT"
|
secureDelete := "DEFAULT"
|
||||||
synchronousMode := "NORMAL"
|
synchronousMode := "NORMAL"
|
||||||
writableSchema := -1
|
writableSchema := -1
|
||||||
|
flags := C.SQLITE_OPEN_READWRITE | C.SQLITE_OPEN_CREATE | C.SQLITE_OPEN_FULLMUTEX
|
||||||
|
|
||||||
pos := strings.IndexRune(dsn, '?')
|
pos := strings.IndexRune(dsn, '?')
|
||||||
if pos >= 1 {
|
if pos >= 1 {
|
||||||
|
@ -1015,6 +1015,17 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
|
||||||
return nil, err
|
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
|
// Authentication
|
||||||
if _, ok := params["_auth"]; ok {
|
if _, ok := params["_auth"]; ok {
|
||||||
authCreate = true
|
authCreate = true
|
||||||
|
@ -1049,9 +1060,9 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
|
||||||
if val := params.Get("_mutex"); val != "" {
|
if val := params.Get("_mutex"); val != "" {
|
||||||
switch strings.ToLower(val) {
|
switch strings.ToLower(val) {
|
||||||
case "no":
|
case "no":
|
||||||
mutex = C.SQLITE_OPEN_NOMUTEX
|
flags |= C.SQLITE_OPEN_NOMUTEX
|
||||||
case "full":
|
case "full":
|
||||||
mutex = C.SQLITE_OPEN_FULLMUTEX
|
flags |= C.SQLITE_OPEN_FULLMUTEX
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("Invalid _mutex: %v", val)
|
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
|
var db *C.sqlite3
|
||||||
name := C.CString(dsn)
|
name := C.CString(dsn)
|
||||||
defer C.free(unsafe.Pointer(name))
|
defer C.free(unsafe.Pointer(name))
|
||||||
rv := C._sqlite3_open_v2(name, &db,
|
|
||||||
mutex|C.SQLITE_OPEN_READWRITE|C.SQLITE_OPEN_CREATE,
|
rv := C._sqlite3_open_v2(name, &db, C.int(flags), nil)
|
||||||
nil)
|
|
||||||
if rv != 0 {
|
if rv != 0 {
|
||||||
if db != nil {
|
if db != nil {
|
||||||
C.sqlite3_close_v2(db)
|
C.sqlite3_close_v2(db)
|
||||||
|
|
Loading…
Reference in New Issue