diff options
Diffstat (limited to 'vendor/github.com/ncruces/go-sqlite3/vfs/cksm.go')
| -rw-r--r-- | vendor/github.com/ncruces/go-sqlite3/vfs/cksm.go | 99 |
1 files changed, 33 insertions, 66 deletions
diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/cksm.go b/vendor/github.com/ncruces/go-sqlite3/vfs/cksm.go index 0ff7b6f18..0123cc634 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/cksm.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/cksm.go @@ -5,7 +5,6 @@ import ( "context" _ "embed" "encoding/binary" - "strconv" "github.com/tetratelabs/wazero/api" @@ -13,48 +12,30 @@ import ( "github.com/ncruces/go-sqlite3/util/sql3util" ) -func cksmWrapFile(name *Filename, flags OpenFlag, file File) File { - // Checksum only main databases and WALs. - if flags&(OPEN_MAIN_DB|OPEN_WAL) == 0 { +func cksmWrapFile(file File, flags OpenFlag) File { + // Checksum only main databases. + if flags&OPEN_MAIN_DB == 0 { return file } - - cksm := cksmFile{File: file} - - if flags&OPEN_WAL != 0 { - main, _ := name.DatabaseFile().(cksmFile) - cksm.cksmFlags = main.cksmFlags - } else { - cksm.cksmFlags = new(cksmFlags) - cksm.isDB = true - } - - return cksm + return &cksmFile{File: file} } type cksmFile struct { File - *cksmFlags - isDB bool -} - -type cksmFlags struct { - computeCksm bool verifyCksm bool - inCkpt bool - pageSize int + computeCksm bool } -func (c cksmFile) ReadAt(p []byte, off int64) (n int, err error) { +func (c *cksmFile) ReadAt(p []byte, off int64) (n int, err error) { n, err = c.File.ReadAt(p, off) p = p[:n] - if isHeader(c.isDB, p, off) { + if isHeader(p, off) { c.init((*[100]byte)(p)) } // Verify checksums. - if c.verifyCksm && !c.inCkpt && len(p) == c.pageSize { + if c.verifyCksm && sql3util.ValidPageSize(len(p)) { cksm1 := cksmCompute(p[:len(p)-8]) cksm2 := *(*[8]byte)(p[len(p)-8:]) if cksm1 != cksm2 { @@ -64,20 +45,20 @@ func (c cksmFile) ReadAt(p []byte, off int64) (n int, err error) { return n, err } -func (c cksmFile) WriteAt(p []byte, off int64) (n int, err error) { - if isHeader(c.isDB, p, off) { +func (c *cksmFile) WriteAt(p []byte, off int64) (n int, err error) { + if isHeader(p, off) { c.init((*[100]byte)(p)) } // Compute checksums. - if c.computeCksm && !c.inCkpt && len(p) == c.pageSize { + if c.computeCksm && sql3util.ValidPageSize(len(p)) { *(*[8]byte)(p[len(p)-8:]) = cksmCompute(p[:len(p)-8]) } return c.File.WriteAt(p, off) } -func (c cksmFile) Pragma(name string, value string) (string, error) { +func (c *cksmFile) Pragma(name string, value string) (string, error) { switch name { case "checksum_verification": b, ok := sql3util.ParseBool(value) @@ -90,15 +71,15 @@ func (c cksmFile) Pragma(name string, value string) (string, error) { return "1", nil case "page_size": - if c.computeCksm { + if c.computeCksm && value != "" { // Do not allow page size changes on a checksum database. - return strconv.Itoa(c.pageSize), nil + return "", nil } } return "", _NOTFOUND } -func (c cksmFile) DeviceCharacteristics() DeviceCharacteristic { +func (c *cksmFile) DeviceCharacteristics() DeviceCharacteristic { ret := c.File.DeviceCharacteristics() if c.verifyCksm { ret &^= IOCAP_SUBPAGE_READ @@ -106,13 +87,8 @@ func (c cksmFile) DeviceCharacteristics() DeviceCharacteristic { return ret } -func (c cksmFile) fileControl(ctx context.Context, mod api.Module, op _FcntlOpcode, pArg ptr_t) _ErrorCode { - switch op { - case _FCNTL_CKPT_START: - c.inCkpt = true - case _FCNTL_CKPT_DONE: - c.inCkpt = false - case _FCNTL_PRAGMA: +func (c *cksmFile) fileControl(ctx context.Context, mod api.Module, op _FcntlOpcode, pArg ptr_t) _ErrorCode { + if op == _FCNTL_PRAGMA { rc := vfsFileControlImpl(ctx, mod, c, op, pArg) if rc != _NOTFOUND { return rc @@ -121,24 +97,26 @@ func (c cksmFile) fileControl(ctx context.Context, mod api.Module, op _FcntlOpco return vfsFileControlImpl(ctx, mod, c.File, op, pArg) } -func (f *cksmFlags) init(header *[100]byte) { - f.pageSize = 256 * int(binary.LittleEndian.Uint16(header[16:18])) - if r := header[20] == 8; r != f.computeCksm { - f.computeCksm = r - f.verifyCksm = r - } - if !sql3util.ValidPageSize(f.pageSize) { - f.computeCksm = false - f.verifyCksm = false +func (c *cksmFile) init(header *[100]byte) { + if r := header[20] == 8; r != c.computeCksm { + c.computeCksm = r + c.verifyCksm = r } } -func isHeader(isDB bool, p []byte, off int64) bool { - check := sql3util.ValidPageSize(len(p)) - if isDB { - check = off == 0 && len(p) >= 100 +func (c *cksmFile) SharedMemory() SharedMemory { + if f, ok := c.File.(FileSharedMemory); ok { + return f.SharedMemory() } - return check && bytes.HasPrefix(p, []byte("SQLite format 3\000")) + return nil +} + +func (c *cksmFile) Unwrap() File { + return c.File +} + +func isHeader(p []byte, off int64) bool { + return off == 0 && len(p) >= 100 && bytes.HasPrefix(p, []byte("SQLite format 3\000")) } func cksmCompute(a []byte) (cksm [8]byte) { @@ -155,14 +133,3 @@ func cksmCompute(a []byte) (cksm [8]byte) { binary.LittleEndian.PutUint32(cksm[4:8], s2) return } - -func (c cksmFile) SharedMemory() SharedMemory { - if f, ok := c.File.(FileSharedMemory); ok { - return f.SharedMemory() - } - return nil -} - -func (c cksmFile) Unwrap() File { - return c.File -} |
