VFS xAccess.

This commit is contained in:
Nuno Cruces
2023-01-19 00:18:39 +00:00
parent bca8487869
commit 8332265b64
2 changed files with 47 additions and 2 deletions

View File

@@ -148,6 +148,14 @@ const (
OPEN_EXRESCODE OpenFlag = 0x02000000 /* Extended result codes */
)
type AccessFlag uint
const (
ACCESS_EXISTS AccessFlag = 0
ACCESS_READWRITE AccessFlag = 1 /* Used by PRAGMA temp_store_directory */
ACCESS_READ AccessFlag = 2 /* Unused */
)
type PrepareFlag uint
const (

41
vfs.go
View File

@@ -2,7 +2,9 @@ package sqlite3
import (
"context"
"errors"
"io"
"io/fs"
"math/rand"
"os"
"path/filepath"
@@ -104,7 +106,42 @@ func vfsFullPathname(ctx context.Context, mod api.Module, vfs, zName, nOut, zOut
func vfsDelete(vfs, zName, syncDir uint32) uint32 { panic("vfsDelete") }
func vfsAccess(vfs, zName, flags, pResOut uint32) uint32 { panic("vfsAccess") }
func vfsAccess(ctx context.Context, mod api.Module, vfs, zName, flags, pResOut uint32) uint32 {
name := getString(mod.Memory(), zName, _MAX_PATHNAME)
fi, err := os.Stat(name)
var res uint32
if flags == uint32(ACCESS_EXISTS) {
switch {
case err == nil:
res = 1
case errors.Is(err, fs.ErrNotExist):
res = 0
default:
return uint32(IOERR_ACCESS)
}
} else if err != nil {
return uint32(IOERR_ACCESS)
} else {
var mask fs.FileMode
if flags == uint32(ACCESS_READWRITE) {
mask = 0600
} else {
mask = 0400
}
if fi.Mode()&mask == mask {
res = 1
} else {
res = 0
}
}
ok := mod.Memory().WriteUint32Le(pResOut, res)
if !ok {
panic("sqlite: out-of-range")
}
return _OK
}
func vfsOpen(ctx context.Context, mod api.Module, vfs, zName, file, flags, pOutFlags uint32) uint32 {
name := getString(mod.Memory(), zName, _MAX_PATHNAME)
@@ -154,7 +191,7 @@ func vfsClose(ctx context.Context, mod api.Module, file uint32) uint32 {
err := c.files[id].Close()
c.files[id] = nil
if err != nil {
return uint32(IOERR)
return uint32(IOERR_CLOSE)
}
return _OK
}