diff --git a/go.mod b/go.mod index f2c52e5..ef8fa7c 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,9 @@ go 1.21 require ( github.com/ncruces/julianday v1.0.0 + github.com/ncruces/sort v0.1.2 github.com/psanford/httpreadat v0.1.0 - github.com/tetratelabs/wazero v1.7.2 + github.com/tetratelabs/wazero v1.7.3 golang.org/x/crypto v0.24.0 golang.org/x/sync v0.7.0 golang.org/x/sys v0.21.0 @@ -13,6 +14,4 @@ require ( lukechampine.com/adiantum v1.1.1 ) -require github.com/ncruces/sort v0.1.2 - retract v0.4.0 // tagged from the wrong branch diff --git a/go.sum b/go.sum index f40e765..bbc1b30 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ github.com/ncruces/sort v0.1.2 h1:zKQ9CA4fpHPF6xsUhRTfi5EEryspuBpe/QA4VWQOV1U= github.com/ncruces/sort v0.1.2/go.mod h1:vEJUTBJtebIuCMmXD18GKo5GJGhsay+xZFOoBEIXFmE= github.com/psanford/httpreadat v0.1.0 h1:VleW1HS2zO7/4c7c7zNl33fO6oYACSagjJIyMIwZLUE= github.com/psanford/httpreadat v0.1.0/go.mod h1:Zg7P+TlBm3bYbyHTKv/EdtSJZn3qwbPwpfZ/I9GKCRE= -github.com/tetratelabs/wazero v1.7.2 h1:1+z5nXJNwMLPAWaTePFi49SSTL0IMx/i3Fg8Yc25GDc= -github.com/tetratelabs/wazero v1.7.2/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/tetratelabs/wazero v1.7.3 h1:PBH5KVahrt3S2AHgEjKu4u+LlDbbk+nsGE3KLucy6Rw= +github.com/tetratelabs/wazero v1.7.3/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= diff --git a/gormlite/go.mod b/gormlite/go.mod index 7808d5c..da246c7 100644 --- a/gormlite/go.mod +++ b/gormlite/go.mod @@ -11,6 +11,6 @@ require ( github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/ncruces/julianday v1.0.0 // indirect - github.com/tetratelabs/wazero v1.7.2 // indirect + github.com/tetratelabs/wazero v1.7.3 // indirect golang.org/x/sys v0.21.0 // indirect ) diff --git a/gormlite/go.sum b/gormlite/go.sum index bc71310..81c189e 100644 --- a/gormlite/go.sum +++ b/gormlite/go.sum @@ -6,8 +6,8 @@ github.com/ncruces/go-sqlite3 v0.16.1 h1:1wHv7s8y+fWK44UIliotJ42ZV41A5T0sjIAqGmn github.com/ncruces/go-sqlite3 v0.16.1/go.mod h1:feFXbBcbLtxNk6XWG1ROt8MS9+E45yCW3G8o4ixIqZ8= github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= -github.com/tetratelabs/wazero v1.7.2 h1:1+z5nXJNwMLPAWaTePFi49SSTL0IMx/i3Fg8Yc25GDc= -github.com/tetratelabs/wazero v1.7.2/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/tetratelabs/wazero v1.7.3 h1:PBH5KVahrt3S2AHgEjKu4u+LlDbbk+nsGE3KLucy6Rw= +github.com/tetratelabs/wazero v1.7.3/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= diff --git a/internal/util/json.go b/internal/util/json.go index c0ba38c..7f6849a 100644 --- a/internal/util/json.go +++ b/internal/util/json.go @@ -26,7 +26,7 @@ func (j JSON) Scan(value any) error { buf = v.AppendFormat(buf, time.RFC3339Nano) buf = append(buf, '"') case nil: - buf = append(buf, "null"...) + buf = []byte("null") default: panic(AssertErr()) } diff --git a/stmt.go b/stmt.go index ac40e38..381a7d0 100644 --- a/stmt.go +++ b/stmt.go @@ -564,7 +564,7 @@ func (s *Stmt) ColumnJSON(col int, ptr any) error { var data []byte switch s.ColumnType(col) { case NULL: - data = append(data, "null"...) + data = []byte("null") case TEXT: data = s.ColumnRawText(col) case BLOB: diff --git a/value.go b/value.go index d0edf21..1894ff4 100644 --- a/value.go +++ b/value.go @@ -177,7 +177,7 @@ func (v Value) JSON(ptr any) error { var data []byte switch v.Type() { case NULL: - data = append(data, "null"...) + data = []byte("null") case TEXT: data = v.RawText() case BLOB: diff --git a/vfs/memdb/memdb.go b/vfs/memdb/memdb.go index 8dc57ab..f21335d 100644 --- a/vfs/memdb/memdb.go +++ b/vfs/memdb/memdb.go @@ -75,11 +75,6 @@ func (memVFS) FullPathname(name string) (string, error) { type memDB struct { name string - // +checklocks:lockMtx - pending *memFile - // +checklocks:lockMtx - reserved *memFile - // +checklocks:dataMtx data []*[sectorSize]byte @@ -88,6 +83,10 @@ type memDB struct { // +checklocks:lockMtx shared int + // +checklocks:lockMtx + reserved bool + // +checklocks:lockMtx + pending bool // +checklocks:memoryMtx refs int @@ -214,24 +213,24 @@ func (m *memFile) Lock(lock vfs.LockLevel) error { switch lock { case vfs.LOCK_SHARED: - if m.pending != nil { + if m.pending { return sqlite3.BUSY } m.shared++ case vfs.LOCK_RESERVED: - if m.reserved != nil { + if m.reserved { return sqlite3.BUSY } - m.reserved = m + m.reserved = true case vfs.LOCK_EXCLUSIVE: if m.lock < vfs.LOCK_PENDING { - if m.pending != nil { + if m.pending { return sqlite3.BUSY } m.lock = vfs.LOCK_PENDING - m.pending = m + m.pending = true } for before := time.Now(); m.shared > 1; { @@ -256,11 +255,11 @@ func (m *memFile) Unlock(lock vfs.LockLevel) error { m.lockMtx.Lock() defer m.lockMtx.Unlock() - if m.pending == m { - m.pending = nil + if m.pending && m.lock >= vfs.LOCK_PENDING { + m.pending = false } - if m.reserved == m { - m.reserved = nil + if m.reserved && m.lock >= vfs.LOCK_RESERVED { + m.reserved = false } if lock < vfs.LOCK_SHARED { m.shared-- @@ -275,7 +274,7 @@ func (m *memFile) CheckReservedLock() (bool, error) { } m.lockMtx.Lock() defer m.lockMtx.Unlock() - return m.reserved != nil, nil + return m.reserved, nil } func (m *memFile) SectorSize() int { diff --git a/vfs/shm_bsd.go b/vfs/shm_bsd.go index 2f61cd3..8c2abee 100644 --- a/vfs/shm_bsd.go +++ b/vfs/shm_bsd.go @@ -101,13 +101,13 @@ func (s *vfsShm) shmOpen() (rc _ErrorCode) { return _OK } - // Open file read-write, as it will be shared. + // Always open file read-write, as it will be shared. f, err := os.OpenFile(s.path, unix.O_RDWR|unix.O_CREAT|unix.O_NOFOLLOW, 0666) if err != nil { return _CANTOPEN } - // Close if file if it's not nil. + // Closes file if it's not nil. defer func() { f.Close() }() fi, err := f.Stat() @@ -145,17 +145,14 @@ func (s *vfsShm) shmOpen() (rc _ErrorCode) { info: fi, refs: 1, } - f = nil - add := true + f = nil // Don't close the file. for i, g := range vfsShmFiles { if g == nil { vfsShmFiles[i] = s.vfsShmFile - add = false + return rc } } - if add { - vfsShmFiles = append(vfsShmFiles, s.vfsShmFile) - } + vfsShmFiles = append(vfsShmFiles, s.vfsShmFile) return rc }