summaryrefslogtreecommitdiff
path: root/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/api.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/ncruces/go-sqlite3/vfs/memdb/api.go')
-rw-r--r--vendor/github.com/ncruces/go-sqlite3/vfs/memdb/api.go68
1 files changed, 68 insertions, 0 deletions
diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/api.go b/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/api.go
new file mode 100644
index 000000000..5a2b84c71
--- /dev/null
+++ b/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/api.go
@@ -0,0 +1,68 @@
+// Package memdb implements the "memdb" SQLite VFS.
+//
+// The "memdb" [vfs.VFS] allows the same in-memory database to be shared
+// among multiple database connections in the same process,
+// as long as the database name begins with "/".
+//
+// Importing package memdb registers the VFS:
+//
+// import _ "github.com/ncruces/go-sqlite3/vfs/memdb"
+package memdb
+
+import (
+ "sync"
+
+ "github.com/ncruces/go-sqlite3/vfs"
+)
+
+func init() {
+ vfs.Register("memdb", memVFS{})
+}
+
+var (
+ memoryMtx sync.Mutex
+ // +checklocks:memoryMtx
+ memoryDBs = map[string]*memDB{}
+)
+
+// Create creates a shared memory database,
+// using data as its initial contents.
+// 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,
+ size: int64(len(data)),
+ }
+
+ // Convert data from WAL to rollback journal.
+ if len(data) >= 20 && data[18] == 2 && data[19] == 2 {
+ data[18] = 1
+ data[19] = 1
+ }
+
+ sectors := divRoundUp(db.size, sectorSize)
+ db.data = make([]*[sectorSize]byte, sectors)
+ for i := range db.data {
+ sector := data[i*sectorSize:]
+ if len(sector) >= sectorSize {
+ db.data[i] = (*[sectorSize]byte)(sector)
+ } else {
+ db.data[i] = new([sectorSize]byte)
+ copy((*db.data[i])[:], sector)
+ }
+ }
+
+ memoryDBs[name] = db
+}
+
+// Delete deletes a shared memory database.
+func Delete(name string) {
+ memoryMtx.Lock()
+ defer memoryMtx.Unlock()
+ delete(memoryDBs, name)
+}