@@ -789,6 +789,8 @@ func errorString(err Error) string {
789
789
// Enable or disable enforcement of foreign keys. X can be 1 or 0.
790
790
// _recursive_triggers=X
791
791
// Enable or disable recursive triggers. X can be 1 or 0.
792
+ // _mutex=XXX
793
+ // Specify mutex mode. XXX can be "no", "full".
792
794
func (d * SQLiteDriver ) Open (dsn string ) (driver.Conn , error ) {
793
795
if C .sqlite3_threadsafe () == 0 {
794
796
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) {
799
801
busyTimeout := 5000
800
802
foreignKeys := - 1
801
803
recursiveTriggers := - 1
804
+ mutex := C .int (C .SQLITE_OPEN_FULLMUTEX )
802
805
pos := strings .IndexRune (dsn , '?' )
803
806
if pos >= 1 {
804
807
params , err := url .ParseQuery (dsn [pos + 1 :])
@@ -865,6 +868,18 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
865
868
}
866
869
}
867
870
871
+ // _mutex
872
+ if val := params .Get ("_mutex" ); val != "" {
873
+ switch val {
874
+ case "no" :
875
+ mutex = C .SQLITE_OPEN_NOMUTEX
876
+ case "full" :
877
+ mutex = C .SQLITE_OPEN_FULLMUTEX
878
+ default :
879
+ return nil , fmt .Errorf ("Invalid _mutex: %v" , val )
880
+ }
881
+ }
882
+
868
883
if ! strings .HasPrefix (dsn , "file:" ) {
869
884
dsn = dsn [:pos ]
870
885
}
@@ -874,9 +889,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
874
889
name := C .CString (dsn )
875
890
defer C .free (unsafe .Pointer (name ))
876
891
rv := C ._sqlite3_open_v2 (name , & db ,
877
- C .SQLITE_OPEN_FULLMUTEX |
878
- C .SQLITE_OPEN_READWRITE |
879
- C .SQLITE_OPEN_CREATE ,
892
+ mutex | C .SQLITE_OPEN_READWRITE | C .SQLITE_OPEN_CREATE ,
880
893
nil )
881
894
if rv != 0 {
882
895
return nil , Error {Code : ErrNo (rv )}
0 commit comments