diff options
Diffstat (limited to 'vendor/github.com/ncruces/go-sqlite3/util')
| -rw-r--r-- | vendor/github.com/ncruces/go-sqlite3/util/sql3util/wasm/sql3parse_table.wasm | bin | 15960 -> 16007 bytes | |||
| -rw-r--r-- | vendor/github.com/ncruces/go-sqlite3/util/vfsutil/slice.go | 102 | ||||
| -rw-r--r-- | vendor/github.com/ncruces/go-sqlite3/util/vfsutil/wrap.go | 185 |
3 files changed, 287 insertions, 0 deletions
diff --git a/vendor/github.com/ncruces/go-sqlite3/util/sql3util/wasm/sql3parse_table.wasm b/vendor/github.com/ncruces/go-sqlite3/util/sql3util/wasm/sql3parse_table.wasm Binary files differindex f7dc0cdf4..996541e76 100644 --- a/vendor/github.com/ncruces/go-sqlite3/util/sql3util/wasm/sql3parse_table.wasm +++ b/vendor/github.com/ncruces/go-sqlite3/util/sql3util/wasm/sql3parse_table.wasm diff --git a/vendor/github.com/ncruces/go-sqlite3/util/vfsutil/slice.go b/vendor/github.com/ncruces/go-sqlite3/util/vfsutil/slice.go new file mode 100644 index 000000000..b0fbe993c --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/util/vfsutil/slice.go @@ -0,0 +1,102 @@ +package vfsutil + +import ( + "io" + + "github.com/ncruces/go-sqlite3" + "github.com/ncruces/go-sqlite3/vfs" +) + +// SliceFile implements [vfs.File] with a byte slice. +// It is suitable for temporary files (such as [vfs.OPEN_TEMP_JOURNAL]), +// but not concurrency safe. +type SliceFile []byte + +var ( + // Ensure these interfaces are implemented: + _ vfs.FileSizeHint = &SliceFile{} +) + +// ReadAt implements [io.ReaderAt]. +func (f *SliceFile) ReadAt(b []byte, off int64) (n int, err error) { + if d := *f; off < int64(len(d)) { + n = copy(b, d[off:]) + } + if n < len(b) { + err = io.EOF + } + return +} + +// WriteAt implements [io.WriterAt]. +func (f *SliceFile) WriteAt(b []byte, off int64) (n int, err error) { + d := *f + if off > int64(len(d)) { + d = append(d, make([]byte, off-int64(len(d)))...) + } + d = append(d[:off], b...) + if len(d) > len(*f) { + *f = d + } + return len(b), nil +} + +// Size implements [vfs.File]. +func (f *SliceFile) Size() (int64, error) { + return int64(len(*f)), nil +} + +// Truncate implements [vfs.File]. +func (f *SliceFile) Truncate(size int64) error { + if d := *f; size < int64(len(d)) { + *f = d[:size] + } + return nil +} + +// SizeHint implements [vfs.FileSizeHint]. +func (f *SliceFile) SizeHint(size int64) error { + if d := *f; size > int64(len(d)) { + *f = append(d, make([]byte, size-int64(len(d)))...) + } + return nil +} + +// Close implements [io.Closer]. +func (*SliceFile) Close() error { return nil } + +// Sync implements [vfs.File]. +func (*SliceFile) Sync(flags vfs.SyncFlag) error { return nil } + +// Lock implements [vfs.File]. +func (*SliceFile) Lock(lock vfs.LockLevel) error { + // notest // not concurrency safe + return sqlite3.IOERR_LOCK +} + +// Unlock implements [vfs.File]. +func (*SliceFile) Unlock(lock vfs.LockLevel) error { + // notest // not concurrency safe + return sqlite3.IOERR_UNLOCK +} + +// CheckReservedLock implements [vfs.File]. +func (*SliceFile) CheckReservedLock() (bool, error) { + // notest // not concurrency safe + return false, sqlite3.IOERR_CHECKRESERVEDLOCK +} + +// SectorSize implements [vfs.File]. +func (*SliceFile) SectorSize() int { + // notest // safe default + return 0 +} + +// DeviceCharacteristics implements [vfs.File]. +func (*SliceFile) DeviceCharacteristics() vfs.DeviceCharacteristic { + return vfs.IOCAP_ATOMIC | + vfs.IOCAP_SEQUENTIAL | + vfs.IOCAP_SAFE_APPEND | + vfs.IOCAP_POWERSAFE_OVERWRITE | + vfs.IOCAP_SUBPAGE_READ +} diff --git a/vendor/github.com/ncruces/go-sqlite3/util/vfsutil/wrap.go b/vendor/github.com/ncruces/go-sqlite3/util/vfsutil/wrap.go new file mode 100644 index 000000000..ad96547fa --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/util/vfsutil/wrap.go @@ -0,0 +1,185 @@ +// Package vfsutil implements virtual filesystem utilities. +package vfsutil + +import ( + "github.com/ncruces/go-sqlite3" + "github.com/ncruces/go-sqlite3/vfs" +) + +// UnwrapFile unwraps a [vfs.File], +// possibly implementing [vfs.FileUnwrap], +// to a concrete type. +func UnwrapFile[T vfs.File](f vfs.File) (_ T, _ bool) { + for { + switch t := f.(type) { + default: + return + case T: + return t, true + case vfs.FileUnwrap: + f = t.Unwrap() + } + } +} + +// WrapOpen helps wrap [vfs.VFS]. +func WrapOpen(f vfs.VFS, name string, flags vfs.OpenFlag) (file vfs.File, _ vfs.OpenFlag, err error) { + if f, ok := f.(vfs.VFSFilename); name == "" && ok { + return f.OpenFilename(nil, flags) + } + return f.Open(name, flags) +} + +// WrapOpenFilename helps wrap [vfs.VFSFilename]. +func WrapOpenFilename(f vfs.VFS, name *vfs.Filename, flags vfs.OpenFlag) (file vfs.File, _ vfs.OpenFlag, err error) { + if f, ok := f.(vfs.VFSFilename); ok { + return f.OpenFilename(name, flags) + } + return f.Open(name.String(), flags) +} + +// WrapLockState helps wrap [vfs.FileLockState]. +func WrapLockState(f vfs.File) vfs.LockLevel { + if f, ok := f.(vfs.FileLockState); ok { + return f.LockState() + } + return vfs.LOCK_EXCLUSIVE + 1 // UNKNOWN_LOCK +} + +// WrapPersistWAL helps wrap [vfs.FilePersistWAL]. +func WrapPersistWAL(f vfs.File) bool { + if f, ok := f.(vfs.FilePersistWAL); ok { + return f.PersistWAL() + } + return false +} + +// WrapSetPersistWAL helps wrap [vfs.FilePersistWAL]. +func WrapSetPersistWAL(f vfs.File, keepWAL bool) { + if f, ok := f.(vfs.FilePersistWAL); ok { + f.SetPersistWAL(keepWAL) + } +} + +// WrapPowersafeOverwrite helps wrap [vfs.FilePowersafeOverwrite]. +func WrapPowersafeOverwrite(f vfs.File) bool { + if f, ok := f.(vfs.FilePowersafeOverwrite); ok { + return f.PowersafeOverwrite() + } + return false +} + +// WrapSetPowersafeOverwrite helps wrap [vfs.FilePowersafeOverwrite]. +func WrapSetPowersafeOverwrite(f vfs.File, psow bool) { + if f, ok := f.(vfs.FilePowersafeOverwrite); ok { + f.SetPowersafeOverwrite(psow) + } +} + +// WrapChunkSize helps wrap [vfs.FileChunkSize]. +func WrapChunkSize(f vfs.File, size int) { + if f, ok := f.(vfs.FileChunkSize); ok { + f.ChunkSize(size) + } +} + +// WrapSizeHint helps wrap [vfs.FileSizeHint]. +func WrapSizeHint(f vfs.File, size int64) error { + if f, ok := f.(vfs.FileSizeHint); ok { + return f.SizeHint(size) + } + return sqlite3.NOTFOUND +} + +// WrapHasMoved helps wrap [vfs.FileHasMoved]. +func WrapHasMoved(f vfs.File) (bool, error) { + if f, ok := f.(vfs.FileHasMoved); ok { + return f.HasMoved() + } + return false, sqlite3.NOTFOUND +} + +// WrapOverwrite helps wrap [vfs.FileOverwrite]. +func WrapOverwrite(f vfs.File) error { + if f, ok := f.(vfs.FileOverwrite); ok { + return f.Overwrite() + } + return sqlite3.NOTFOUND +} + +// WrapSyncSuper helps wrap [vfs.FileSync]. +func WrapSyncSuper(f vfs.File, super string) error { + if f, ok := f.(vfs.FileSync); ok { + return f.SyncSuper(super) + } + return sqlite3.NOTFOUND +} + +// WrapCommitPhaseTwo helps wrap [vfs.FileCommitPhaseTwo]. +func WrapCommitPhaseTwo(f vfs.File) error { + if f, ok := f.(vfs.FileCommitPhaseTwo); ok { + return f.CommitPhaseTwo() + } + return sqlite3.NOTFOUND +} + +// WrapBeginAtomicWrite helps wrap [vfs.FileBatchAtomicWrite]. +func WrapBeginAtomicWrite(f vfs.File) error { + if f, ok := f.(vfs.FileBatchAtomicWrite); ok { + return f.BeginAtomicWrite() + } + return sqlite3.NOTFOUND +} + +// WrapCommitAtomicWrite helps wrap [vfs.FileBatchAtomicWrite]. +func WrapCommitAtomicWrite(f vfs.File) error { + if f, ok := f.(vfs.FileBatchAtomicWrite); ok { + return f.CommitAtomicWrite() + } + return sqlite3.NOTFOUND +} + +// WrapRollbackAtomicWrite helps wrap [vfs.FileBatchAtomicWrite]. +func WrapRollbackAtomicWrite(f vfs.File) error { + if f, ok := f.(vfs.FileBatchAtomicWrite); ok { + return f.RollbackAtomicWrite() + } + return sqlite3.NOTFOUND +} + +// WrapCheckpointStart helps wrap [vfs.FileCheckpoint]. +func WrapCheckpointStart(f vfs.File) { + if f, ok := f.(vfs.FileCheckpoint); ok { + f.CheckpointStart() + } +} + +// WrapCheckpointDone helps wrap [vfs.FileCheckpoint]. +func WrapCheckpointDone(f vfs.File) { + if f, ok := f.(vfs.FileCheckpoint); ok { + f.CheckpointDone() + } +} + +// WrapPragma helps wrap [vfs.FilePragma]. +func WrapPragma(f vfs.File, name, value string) (string, error) { + if f, ok := f.(vfs.FilePragma); ok { + return f.Pragma(name, value) + } + return "", sqlite3.NOTFOUND +} + +// WrapBusyHandler helps wrap [vfs.FilePragma]. +func WrapBusyHandler(f vfs.File, handler func() bool) { + if f, ok := f.(vfs.FileBusyHandler); ok { + f.BusyHandler(handler) + } +} + +// WrapSharedMemory helps wrap [vfs.FileSharedMemory]. +func WrapSharedMemory(f vfs.File) vfs.SharedMemory { + if f, ok := f.(vfs.FileSharedMemory); ok { + return f.SharedMemory() + } + return nil +} |
