diff options
Diffstat (limited to 'vendor/github.com/ncruces/go-sqlite3/vfs/memdb')
-rw-r--r-- | vendor/github.com/ncruces/go-sqlite3/vfs/memdb/api.go | 35 | ||||
-rw-r--r-- | vendor/github.com/ncruces/go-sqlite3/vfs/memdb/memdb.go | 12 |
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 } |