mirror of
https://github.com/ncruces/go-sqlite3.git
synced 2026-01-11 21:49:13 +00:00
Experimental file control opcode for write transaction (#339)
This commit is contained in:
Binary file not shown.
@@ -59,6 +59,7 @@ cd ~-
|
|||||||
-D_HAVE_SQLITE_CONFIG_H \
|
-D_HAVE_SQLITE_CONFIG_H \
|
||||||
-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT \
|
-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT \
|
||||||
-DSQLITE_ENABLE_ORDERED_SET_AGGREGATES \
|
-DSQLITE_ENABLE_ORDERED_SET_AGGREGATES \
|
||||||
|
-DSQLITE_EXPERIMENTAL_PRAGMA_20251114 \
|
||||||
-DSQLITE_CUSTOM_INCLUDE=sqlite_opt.h \
|
-DSQLITE_CUSTOM_INCLUDE=sqlite_opt.h \
|
||||||
$(awk '{print "-Wl,--export="$0}' ../exports.txt)
|
$(awk '{print "-Wl,--export="$0}' ../exports.txt)
|
||||||
|
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ type mvccFile struct {
|
|||||||
data *wbt.Tree[int64, string]
|
data *wbt.Tree[int64, string]
|
||||||
lock vfs.LockLevel
|
lock vfs.LockLevel
|
||||||
readOnly bool
|
readOnly bool
|
||||||
|
wrflag bool
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -212,6 +213,14 @@ func (m *mvccFile) Truncate(size int64) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *mvccFile) Pragma(name, value string) (string, error) {
|
||||||
|
// notest // https://sqlite.org/forum/forumpost/c4ca8e7f4a887aa4
|
||||||
|
if name == "experimental_pragma_20251114" {
|
||||||
|
m.wrflag = true
|
||||||
|
}
|
||||||
|
return "", sqlite3.NOTFOUND
|
||||||
|
}
|
||||||
|
|
||||||
func (m *mvccFile) Lock(lock vfs.LockLevel) error {
|
func (m *mvccFile) Lock(lock vfs.LockLevel) error {
|
||||||
if m.lock >= lock {
|
if m.lock >= lock {
|
||||||
return nil
|
return nil
|
||||||
@@ -225,7 +234,7 @@ func (m *mvccFile) Lock(lock vfs.LockLevel) error {
|
|||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
// Take a snapshot of the database.
|
// Take a snapshot of the database.
|
||||||
if lock == vfs.LOCK_SHARED {
|
if lock == vfs.LOCK_SHARED && !m.wrflag {
|
||||||
m.data = m.mvccDB.data
|
m.data = m.mvccDB.data
|
||||||
m.lock = lock
|
m.lock = lock
|
||||||
return nil
|
return nil
|
||||||
@@ -244,7 +253,7 @@ func (m *mvccFile) Lock(lock vfs.LockLevel) error {
|
|||||||
defer time.AfterFunc(time.Millisecond, m.waiter.Broadcast).Stop()
|
defer time.AfterFunc(time.Millisecond, m.waiter.Broadcast).Stop()
|
||||||
for m.owner != nil {
|
for m.owner != nil {
|
||||||
// Our snapshot is invalid.
|
// Our snapshot is invalid.
|
||||||
if m.data != m.mvccDB.data {
|
if m.data != nil && m.data != m.mvccDB.data {
|
||||||
return sqlite3.BUSY_SNAPSHOT
|
return sqlite3.BUSY_SNAPSHOT
|
||||||
}
|
}
|
||||||
if time.Since(before) > time.Millisecond {
|
if time.Since(before) > time.Millisecond {
|
||||||
@@ -253,11 +262,15 @@ func (m *mvccFile) Lock(lock vfs.LockLevel) error {
|
|||||||
m.waiter.Wait()
|
m.waiter.Wait()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Our snapshot is invalid.
|
switch {
|
||||||
if m.data != m.mvccDB.data {
|
case m.data == nil:
|
||||||
|
m.data = m.mvccDB.data
|
||||||
|
case m.data != m.mvccDB.data:
|
||||||
|
// Our snapshot is invalid.
|
||||||
return sqlite3.BUSY_SNAPSHOT
|
return sqlite3.BUSY_SNAPSHOT
|
||||||
}
|
}
|
||||||
// Take ownership.
|
// Take ownership.
|
||||||
|
m.wrflag = false
|
||||||
m.lock = lock
|
m.lock = lock
|
||||||
m.owner = m
|
m.owner = m
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
Reference in New Issue
Block a user