Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 03cb0c0

Browse files
authored
Merge pull request mattn#673 from rittneje/revert-671
Revert 671
2 parents 248a1e6 + 2fe51da commit 03cb0c0

File tree

2 files changed

+64
-16
lines changed

2 files changed

+64
-16
lines changed

‎sqlite3.go

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -990,6 +990,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
990990
authPass := ""
991991
authCrypt := ""
992992
authSalt := ""
993+
mutex := C.int(C.SQLITE_OPEN_FULLMUTEX)
993994
txlock := "BEGIN"
994995

995996
// PRAGMA's
@@ -1006,7 +1007,6 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
10061007
secureDelete := "DEFAULT"
10071008
synchronousMode := "NORMAL"
10081009
writableSchema := -1
1009-
flags := C.SQLITE_OPEN_READWRITE | C.SQLITE_OPEN_CREATE | C.SQLITE_OPEN_FULLMUTEX
10101010

10111011
pos := strings.IndexRune(dsn, '?')
10121012
if pos >= 1 {
@@ -1015,17 +1015,6 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
10151015
return nil, err
10161016
}
10171017

1018-
if val := params.Get("mode"); val != "" {
1019-
switch val {
1020-
case "ro":
1021-
flags |= C.SQLITE_OPEN_READONLY
1022-
case "rw":
1023-
flags ^= C.SQLITE_OPEN_CREATE
1024-
case "rwc":
1025-
flags |= C.SQLITE_OPEN_CREATE
1026-
}
1027-
}
1028-
10291018
// Authentication
10301019
if _, ok := params["_auth"]; ok {
10311020
authCreate = true
@@ -1060,9 +1049,9 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
10601049
if val := params.Get("_mutex"); val != "" {
10611050
switch strings.ToLower(val) {
10621051
case "no":
1063-
flags|= C.SQLITE_OPEN_NOMUTEX
1052+
mutex= C.SQLITE_OPEN_NOMUTEX
10641053
case "full":
1065-
flags|= C.SQLITE_OPEN_FULLMUTEX
1054+
mutex= C.SQLITE_OPEN_FULLMUTEX
10661055
default:
10671056
return nil, fmt.Errorf("Invalid _mutex: %v", val)
10681057
}
@@ -1349,8 +1338,9 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
13491338
var db *C.sqlite3
13501339
name := C.CString(dsn)
13511340
defer C.free(unsafe.Pointer(name))
1352-
1353-
rv := C._sqlite3_open_v2(name, &db, C.int(flags), nil)
1341+
rv := C._sqlite3_open_v2(name, &db,
1342+
mutex|C.SQLITE_OPEN_READWRITE|C.SQLITE_OPEN_CREATE,
1343+
nil)
13541344
if rv != 0 {
13551345
if db != nil {
13561346
C.sqlite3_close_v2(db)

‎sqlite3_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,64 @@ func TestOpen(t *testing.T) {
8787
}
8888
}
8989

90+
func TestOpenNoCreate(t *testing.T) {
91+
filename := t.Name() + ".sqlite"
92+
93+
if err := os.Remove(filename); err != nil && !os.IsNotExist(err) {
94+
t.Fatal(err)
95+
}
96+
defer os.Remove(filename)
97+
98+
// https://golang.org/pkg/database/sql/#Open
99+
// "Open may just validate its arguments without creating a connection
100+
// to the database. To verify that the data source name is valid, call Ping."
101+
db, err := sql.Open("sqlite3", fmt.Sprintf("file:%s?mode=rw", filename))
102+
if err == nil {
103+
defer db.Close()
104+
105+
err = db.Ping()
106+
if err == nil {
107+
t.Fatal("expected error from Open or Ping")
108+
}
109+
}
110+
111+
sqlErr, ok := err.(Error)
112+
if !ok {
113+
t.Fatalf("expected sqlite3.Error, but got %T", err)
114+
}
115+
116+
if sqlErr.Code != ErrCantOpen {
117+
t.Fatalf("expected SQLITE_CANTOPEN, but got %v", sqlErr)
118+
}
119+
120+
// make sure database file truly was not created
121+
if _, err := os.Stat(filename); !os.IsNotExist(err) {
122+
if err != nil {
123+
t.Fatal(err)
124+
}
125+
t.Fatal("expected database file to not exist")
126+
}
127+
128+
// verify that it works if the mode is "rwc" instead
129+
db, err = sql.Open("sqlite3", fmt.Sprintf("file:%s?mode=rwc", filename))
130+
if err != nil {
131+
t.Fatal(err)
132+
}
133+
defer db.Close()
134+
135+
if err := db.Ping(); err != nil {
136+
t.Fatal(err)
137+
}
138+
139+
// make sure database file truly was created
140+
if _, err := os.Stat(filename); err != nil {
141+
if !os.IsNotExist(err) {
142+
t.Fatal(err)
143+
}
144+
t.Fatal("expected database file to exist")
145+
}
146+
}
147+
90148
func TestReadonly(t *testing.T) {
91149
tempFilename := TempFilename(t)
92150
defer os.Remove(tempFilename)

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /