mirror of
https://github.com/ncruces/go-sqlite3.git
synced 2026-01-12 05:59:14 +00:00
Reduce mutex scope, use temp files.
This commit is contained in:
@@ -34,9 +34,6 @@ var (
|
||||
// The new database takes ownership of data,
|
||||
// and the caller should not use data after this call.
|
||||
func Create(name string, data []byte) {
|
||||
memoryMtx.Lock()
|
||||
defer memoryMtx.Unlock()
|
||||
|
||||
db := &memDB{
|
||||
refs: 1,
|
||||
name: name,
|
||||
@@ -63,14 +60,16 @@ func Create(name string, data []byte) {
|
||||
}
|
||||
}
|
||||
|
||||
memoryMtx.Lock()
|
||||
memoryDBs[name] = db
|
||||
memoryMtx.Unlock()
|
||||
}
|
||||
|
||||
// Delete deletes a shared memory database.
|
||||
func Delete(name string) {
|
||||
memoryMtx.Lock()
|
||||
defer memoryMtx.Unlock()
|
||||
delete(memoryDBs, name)
|
||||
memoryMtx.Unlock()
|
||||
}
|
||||
|
||||
// TestDB creates an empty shared memory database for the test to use.
|
||||
|
||||
@@ -92,10 +92,10 @@ type memDB struct {
|
||||
|
||||
func (m *memDB) release() {
|
||||
memoryMtx.Lock()
|
||||
defer memoryMtx.Unlock()
|
||||
if m.refs--; m.refs == 0 && m == memoryDBs[m.name] {
|
||||
delete(memoryDBs, m.name)
|
||||
}
|
||||
memoryMtx.Unlock()
|
||||
}
|
||||
|
||||
type memFile struct {
|
||||
|
||||
@@ -35,13 +35,12 @@ var (
|
||||
// using a snapshot as its initial contents.
|
||||
func Create(name string, snapshot Snapshot) {
|
||||
memoryMtx.Lock()
|
||||
defer memoryMtx.Unlock()
|
||||
|
||||
memoryDBs[name] = &mvccDB{
|
||||
refs: 1,
|
||||
name: name,
|
||||
data: snapshot.Tree,
|
||||
}
|
||||
memoryMtx.Unlock()
|
||||
}
|
||||
|
||||
// Delete deletes a shared memory database.
|
||||
@@ -49,8 +48,8 @@ func Delete(name string) {
|
||||
name = getName(name)
|
||||
|
||||
memoryMtx.Lock()
|
||||
defer memoryMtx.Unlock()
|
||||
delete(memoryDBs, name)
|
||||
memoryMtx.Unlock()
|
||||
}
|
||||
|
||||
// Snapshot represents a database snapshot.
|
||||
@@ -83,8 +82,9 @@ func TakeSnapshot(name string) Snapshot {
|
||||
name = getName(name)
|
||||
|
||||
memoryMtx.Lock()
|
||||
defer memoryMtx.Unlock()
|
||||
db := memoryDBs[name]
|
||||
memoryMtx.Unlock()
|
||||
|
||||
if db == nil {
|
||||
return Snapshot{}
|
||||
}
|
||||
|
||||
@@ -79,10 +79,10 @@ type mvccDB struct {
|
||||
|
||||
func (m *mvccDB) release() {
|
||||
memoryMtx.Lock()
|
||||
defer memoryMtx.Unlock()
|
||||
if m.refs--; m.refs == 0 && m == memoryDBs[m.name] {
|
||||
delete(memoryDBs, m.name)
|
||||
}
|
||||
memoryMtx.Unlock()
|
||||
}
|
||||
|
||||
type mvccFile struct {
|
||||
@@ -105,10 +105,10 @@ func (m *mvccFile) Close() error {
|
||||
m.data = nil
|
||||
m.lock = vfs.LOCK_NONE
|
||||
m.mtx.Lock()
|
||||
defer m.mtx.Unlock()
|
||||
if m.owner == m {
|
||||
m.owner = nil
|
||||
}
|
||||
m.mtx.Unlock()
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -313,10 +313,10 @@ func (m *mvccFile) CommitPhaseTwo() error {
|
||||
// Modified without lock, commit changes.
|
||||
if m.lock > vfs.LOCK_EXCLUSIVE {
|
||||
m.mtx.Lock()
|
||||
defer m.mtx.Unlock()
|
||||
m.mvccDB.data = m.data
|
||||
m.lock = vfs.LOCK_NONE
|
||||
m.data = nil
|
||||
m.mtx.Unlock()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -30,13 +30,13 @@ var (
|
||||
// otherwise SQLite might return incorrect query results and/or [sqlite3.CORRUPT] errors.
|
||||
func Create(name string, reader ioutil.SizeReaderAt) {
|
||||
readerMtx.Lock()
|
||||
defer readerMtx.Unlock()
|
||||
readerDBs[name] = reader
|
||||
readerMtx.Unlock()
|
||||
}
|
||||
|
||||
// Delete deletes a shared memory database.
|
||||
func Delete(name string) {
|
||||
readerMtx.Lock()
|
||||
defer readerMtx.Unlock()
|
||||
delete(readerDBs, name)
|
||||
readerMtx.Unlock()
|
||||
}
|
||||
|
||||
@@ -3,16 +3,15 @@ package readervfs
|
||||
import (
|
||||
"github.com/ncruces/go-sqlite3"
|
||||
"github.com/ncruces/go-sqlite3/util/ioutil"
|
||||
"github.com/ncruces/go-sqlite3/util/vfsutil"
|
||||
"github.com/ncruces/go-sqlite3/vfs"
|
||||
)
|
||||
|
||||
type readerVFS struct{}
|
||||
|
||||
func (readerVFS) Open(name string, flags vfs.OpenFlag) (vfs.File, vfs.OpenFlag, error) {
|
||||
// Temp journals, as used by the sorter, use SliceFile.
|
||||
// Temp journals, as used by the sorter, use a temporary file.
|
||||
if flags&vfs.OPEN_TEMP_JOURNAL != 0 {
|
||||
return &vfsutil.SliceFile{}, flags | vfs.OPEN_MEMORY, nil
|
||||
return vfs.Find("").Open(name, flags)
|
||||
}
|
||||
// Refuse to open all other file types.
|
||||
if flags&vfs.OPEN_MAIN_DB == 0 {
|
||||
|
||||
@@ -10,13 +10,17 @@ var (
|
||||
|
||||
// Find returns a VFS given its name.
|
||||
// If there is no match, nil is returned.
|
||||
// If name is empty, the default VFS is returned.
|
||||
// If name is empty or "os", the default VFS is returned.
|
||||
//
|
||||
// https://sqlite.org/c3ref/vfs_find.html
|
||||
func Find(name string) VFS {
|
||||
if name == "" || name == "os" {
|
||||
return vfsOS{}
|
||||
}
|
||||
return find(name)
|
||||
}
|
||||
|
||||
func find(name string) VFS {
|
||||
vfsRegistryMtx.RLock()
|
||||
defer vfsRegistryMtx.RUnlock()
|
||||
return vfsRegistry[name]
|
||||
@@ -31,11 +35,11 @@ func Register(name string, vfs VFS) {
|
||||
return
|
||||
}
|
||||
vfsRegistryMtx.Lock()
|
||||
defer vfsRegistryMtx.Unlock()
|
||||
if vfsRegistry == nil {
|
||||
vfsRegistry = map[string]VFS{}
|
||||
}
|
||||
vfsRegistry[name] = vfs
|
||||
vfsRegistryMtx.Unlock()
|
||||
}
|
||||
|
||||
// Unregister unregisters a VFS.
|
||||
@@ -43,6 +47,6 @@ func Register(name string, vfs VFS) {
|
||||
// https://sqlite.org/c3ref/vfs_find.html
|
||||
func Unregister(name string) {
|
||||
vfsRegistryMtx.Lock()
|
||||
defer vfsRegistryMtx.Unlock()
|
||||
delete(vfsRegistry, name)
|
||||
vfsRegistryMtx.Unlock()
|
||||
}
|
||||
|
||||
@@ -50,8 +50,7 @@ func ExportHostFunctions(env wazero.HostModuleBuilder) wazero.HostModuleBuilder
|
||||
}
|
||||
|
||||
func vfsFind(ctx context.Context, mod api.Module, zVfsName ptr_t) uint32 {
|
||||
name := util.ReadString(mod, zVfsName, _MAX_NAME)
|
||||
if vfs := Find(name); vfs != nil && vfs != (vfsOS{}) {
|
||||
if find(util.ReadString(mod, zVfsName, _MAX_NAME)) != nil {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
|
||||
Reference in New Issue
Block a user