@@ -783,6 +783,8 @@ func errorString(err Error) string {
783
783
// Enable or disable enforcement of foreign keys. X can be 1 or 0.
784
784
// _recursive_triggers=X
785
785
// Enable or disable recursive triggers. X can be 1 or 0.
786
+ // _mutex=XXX
787
+ // Specify mutex mode. XXX can be "no", "full".
786
788
func (d * SQLiteDriver ) Open (dsn string ) (driver.Conn , error ) {
787
789
if C .sqlite3_threadsafe () == 0 {
788
790
return nil , errors .New ("sqlite library was not compiled for thread-safe operation" )
@@ -793,6 +795,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
793
795
busyTimeout := 5000
794
796
foreignKeys := - 1
795
797
recursiveTriggers := - 1
798
+ mutex := C .int (C .SQLITE_OPEN_FULLMUTEX )
796
799
pos := strings .IndexRune (dsn , '?' )
797
800
if pos >= 1 {
798
801
params , err := url .ParseQuery (dsn [pos + 1 :])
@@ -859,6 +862,18 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
859
862
}
860
863
}
861
864
865
+ // _mutex
866
+ if val := params .Get ("_mutex" ); val != "" {
867
+ switch val {
868
+ case "no" :
869
+ mutex = C .SQLITE_OPEN_NOMUTEX
870
+ case "full" :
871
+ mutex = C .SQLITE_OPEN_FULLMUTEX
872
+ default :
873
+ return nil , fmt .Errorf ("Invalid _mutex: %v" , val )
874
+ }
875
+ }
876
+
862
877
if ! strings .HasPrefix (dsn , "file:" ) {
863
878
dsn = dsn [:pos ]
864
879
}
@@ -868,9 +883,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
868
883
name := C .CString (dsn )
869
884
defer C .free (unsafe .Pointer (name ))
870
885
rv := C ._sqlite3_open_v2 (name , & db ,
871
- C .SQLITE_OPEN_FULLMUTEX |
872
- C .SQLITE_OPEN_READWRITE |
873
- C .SQLITE_OPEN_CREATE ,
886
+ mutex | C .SQLITE_OPEN_READWRITE | C .SQLITE_OPEN_CREATE ,
874
887
nil )
875
888
if rv != 0 {
876
889
return nil , Error {Code : ErrNo (rv )}
0 commit comments