summaryrefslogtreecommitdiff
path: root/vendor/github.com/ncruces/go-sqlite3/vfs/memdb
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/ncruces/go-sqlite3/vfs/memdb')
-rw-r--r--vendor/github.com/ncruces/go-sqlite3/vfs/memdb/api.go35
-rw-r--r--vendor/github.com/ncruces/go-sqlite3/vfs/memdb/memdb.go12
2 files changed, 39 insertions, 8 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
index 5a2b84c71..843488966 100644
--- a/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/api.go
+++ b/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/api.go
@@ -10,7 +10,10 @@
package memdb
import (
+ "fmt"
+ "net/url"
"sync"
+ "testing"
"github.com/ncruces/go-sqlite3/vfs"
)
@@ -39,8 +42,9 @@ func Create(name string, data []byte) {
size: int64(len(data)),
}
- // Convert data from WAL to rollback journal.
- if len(data) >= 20 && data[18] == 2 && data[19] == 2 {
+ // Convert data from WAL/2 to rollback journal.
+ if len(data) >= 20 && (data[18] == 2 && data[19] == 2 ||
+ data[18] == 3 && data[19] == 3) {
data[18] = 1
data[19] = 1
}
@@ -66,3 +70,30 @@ func Delete(name string) {
defer memoryMtx.Unlock()
delete(memoryDBs, name)
}
+
+// TestDB creates an empty shared memory database for the test to use.
+// The database is automatically deleted when the test and all its subtests complete.
+// Each subsequent call to TestDB returns a unique database.
+func TestDB(tb testing.TB, params ...url.Values) string {
+ tb.Helper()
+
+ name := fmt.Sprintf("%s_%p", tb.Name(), tb)
+ tb.Cleanup(func() { Delete(name) })
+ Create(name, nil)
+
+ p := url.Values{"vfs": {"memdb"}}
+ for _, v := range params {
+ for k, v := range v {
+ for _, v := range v {
+ p.Add(k, v)
+ }
+ }
+ }
+
+ return (&url.URL{
+ Scheme: "file",
+ OmitHost: true,
+ Path: "/" + name,
+ RawQuery: p.Encode(),
+ }).String()
+}
diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/memdb.go b/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/memdb.go
index f21335d8e..d313b45d1 100644
--- a/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/memdb.go
+++ b/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/memdb.go
@@ -30,6 +30,7 @@ func (memVFS) Open(name string, flags vfs.OpenFlag) (vfs.File, vfs.OpenFlag, err
vfs.OPEN_TEMP_DB |
vfs.OPEN_TEMP_JOURNAL
if flags&types == 0 {
+ // notest // OPEN_MEMORY
return nil, flags, sqlite3.CANTOPEN
}
@@ -82,7 +83,7 @@ type memDB struct {
size int64
// +checklocks:lockMtx
- shared int
+ shared int32
// +checklocks:lockMtx
reserved bool
// +checklocks:lockMtx
@@ -136,7 +137,7 @@ func (m *memFile) ReadAt(b []byte, off int64) (n int, err error) {
}
n = copy(b, (*m.data[base])[rest:have])
if n < len(b) {
- // Assume reads are page aligned.
+ // notest // assume reads are page aligned
return 0, io.ErrNoProgress
}
return n, nil
@@ -153,7 +154,7 @@ func (m *memFile) WriteAt(b []byte, off int64) (n int, err error) {
}
n = copy((*m.data[base])[rest:], b)
if n < len(b) {
- // Assume writes are page aligned.
+ // notest // assume writes are page aligned
return n, io.ErrShortWrite
}
if size := off + int64(len(b)); size > m.size {
@@ -226,9 +227,6 @@ func (m *memFile) Lock(lock vfs.LockLevel) error {
case vfs.LOCK_EXCLUSIVE:
if m.lock < vfs.LOCK_PENDING {
- if m.pending {
- return sqlite3.BUSY
- }
m.lock = vfs.LOCK_PENDING
m.pending = true
}
@@ -269,6 +267,7 @@ func (m *memFile) Unlock(lock vfs.LockLevel) error {
}
func (m *memFile) CheckReservedLock() (bool, error) {
+ // notest // OPEN_MEMORY
if m.lock >= vfs.LOCK_RESERVED {
return true, nil
}
@@ -278,6 +277,7 @@ func (m *memFile) CheckReservedLock() (bool, error) {
}
func (m *memFile) SectorSize() int {
+ // notest // IOCAP_POWERSAFE_OVERWRITE
return sectorSize
}