Step API.

This commit is contained in:
Nuno Cruces
2023-01-21 00:33:46 +00:00
parent 8001472090
commit 5643077254
8 changed files with 117 additions and 104 deletions

View File

@@ -68,12 +68,7 @@ func wasmTest() {
}
defer stmt.Close()
for {
if row, err := stmt.Step(); err != nil {
panic(err)
} else if !row {
break
}
for stmt.Step() {
id := stmt.ColumnInt(0)
name := stmt.ColumnText(1)
age := stmt.ColumnInt64(2)
@@ -82,5 +77,8 @@ func wasmTest() {
panic("wrong row values")
}
}
if stmt.Err() != nil {
panic(err)
}
}()
}

View File

@@ -29,14 +29,12 @@ func main() {
log.Fatal(err)
}
for {
if row, err := stmt.Step(); err != nil {
log.Fatal(err)
} else if !row {
break
}
for stmt.Step() {
fmt.Println(stmt.ColumnInt(0), stmt.ColumnText(1))
}
if stmt.Err() != nil {
log.Fatal(err)
}
err = stmt.Close()
if err != nil {

View File

@@ -142,7 +142,7 @@ func (c *Conn) error(rc uint64) error {
}
serr := Error{
Code: ErrorCode(rc & 0xFF),
Code: ErrorCode(rc),
ExtendedCode: ExtendedErrorCode(rc),
}

152
const.go
View File

@@ -10,7 +10,7 @@ const (
_MAX_PATHNAME = 512
)
type ErrorCode int
type ErrorCode uint8
const (
ERROR ErrorCode = 1 /* Generic error */
@@ -21,7 +21,7 @@ const (
LOCKED ErrorCode = 6 /* A table in the database is locked */
NOMEM ErrorCode = 7 /* A malloc() failed */
READONLY ErrorCode = 8 /* Attempt to write a readonly database */
INTERRUPT ErrorCode = 9 /* Operation terminated by sqlite3_interrupt()*/
INTERRUPT ErrorCode = 9 /* Operation terminated by sqlite3_interrupt() */
IOERR ErrorCode = 10 /* Some kind of disk I/O error occurred */
CORRUPT ErrorCode = 11 /* The database disk image is malformed */
NOTFOUND ErrorCode = 12 /* Unknown opcode in sqlite3_file_control() */
@@ -43,82 +43,82 @@ const (
WARNING ErrorCode = 28 /* Warnings from sqlite3_log() */
)
type ExtendedErrorCode int
type ExtendedErrorCode uint16
const (
ERROR_MISSING_COLLSEQ = ExtendedErrorCode(ERROR | (1 << 8))
ERROR_RETRY = ExtendedErrorCode(ERROR | (2 << 8))
ERROR_SNAPSHOT = ExtendedErrorCode(ERROR | (3 << 8))
IOERR_READ = ExtendedErrorCode(IOERR | (1 << 8))
IOERR_SHORT_READ = ExtendedErrorCode(IOERR | (2 << 8))
IOERR_WRITE = ExtendedErrorCode(IOERR | (3 << 8))
IOERR_FSYNC = ExtendedErrorCode(IOERR | (4 << 8))
IOERR_DIR_FSYNC = ExtendedErrorCode(IOERR | (5 << 8))
IOERR_TRUNCATE = ExtendedErrorCode(IOERR | (6 << 8))
IOERR_FSTAT = ExtendedErrorCode(IOERR | (7 << 8))
IOERR_UNLOCK = ExtendedErrorCode(IOERR | (8 << 8))
IOERR_RDLOCK = ExtendedErrorCode(IOERR | (9 << 8))
IOERR_DELETE = ExtendedErrorCode(IOERR | (10 << 8))
IOERR_BLOCKED = ExtendedErrorCode(IOERR | (11 << 8))
IOERR_NOMEM = ExtendedErrorCode(IOERR | (12 << 8))
IOERR_ACCESS = ExtendedErrorCode(IOERR | (13 << 8))
IOERR_CHECKRESERVEDLOCK = ExtendedErrorCode(IOERR | (14 << 8))
IOERR_LOCK = ExtendedErrorCode(IOERR | (15 << 8))
IOERR_CLOSE = ExtendedErrorCode(IOERR | (16 << 8))
IOERR_DIR_CLOSE = ExtendedErrorCode(IOERR | (17 << 8))
IOERR_SHMOPEN = ExtendedErrorCode(IOERR | (18 << 8))
IOERR_SHMSIZE = ExtendedErrorCode(IOERR | (19 << 8))
IOERR_SHMLOCK = ExtendedErrorCode(IOERR | (20 << 8))
IOERR_SHMMAP = ExtendedErrorCode(IOERR | (21 << 8))
IOERR_SEEK = ExtendedErrorCode(IOERR | (22 << 8))
IOERR_DELETE_NOENT = ExtendedErrorCode(IOERR | (23 << 8))
IOERR_MMAP = ExtendedErrorCode(IOERR | (24 << 8))
IOERR_GETTEMPPATH = ExtendedErrorCode(IOERR | (25 << 8))
IOERR_CONVPATH = ExtendedErrorCode(IOERR | (26 << 8))
IOERR_VNODE = ExtendedErrorCode(IOERR | (27 << 8))
IOERR_AUTH = ExtendedErrorCode(IOERR | (28 << 8))
IOERR_BEGIN_ATOMIC = ExtendedErrorCode(IOERR | (29 << 8))
IOERR_COMMIT_ATOMIC = ExtendedErrorCode(IOERR | (30 << 8))
IOERR_ROLLBACK_ATOMIC = ExtendedErrorCode(IOERR | (31 << 8))
IOERR_DATA = ExtendedErrorCode(IOERR | (32 << 8))
IOERR_CORRUPTFS = ExtendedErrorCode(IOERR | (33 << 8))
LOCKED_SHAREDCACHE = ExtendedErrorCode(LOCKED | (1 << 8))
LOCKED_VTAB = ExtendedErrorCode(LOCKED | (2 << 8))
BUSY_RECOVERY = ExtendedErrorCode(BUSY | (1 << 8))
BUSY_SNAPSHOT = ExtendedErrorCode(BUSY | (2 << 8))
BUSY_TIMEOUT = ExtendedErrorCode(BUSY | (3 << 8))
CANTOPEN_NOTEMPDIR = ExtendedErrorCode(CANTOPEN | (1 << 8))
CANTOPEN_ISDIR = ExtendedErrorCode(CANTOPEN | (2 << 8))
CANTOPEN_FULLPATH = ExtendedErrorCode(CANTOPEN | (3 << 8))
CANTOPEN_CONVPATH = ExtendedErrorCode(CANTOPEN | (4 << 8))
CANTOPEN_DIRTYWAL = ExtendedErrorCode(CANTOPEN | (5 << 8)) /* Not Used */
CANTOPEN_SYMLINK = ExtendedErrorCode(CANTOPEN | (6 << 8))
CORRUPT_VTAB = ExtendedErrorCode(CORRUPT | (1 << 8))
CORRUPT_SEQUENCE = ExtendedErrorCode(CORRUPT | (2 << 8))
CORRUPT_INDEX = ExtendedErrorCode(CORRUPT | (3 << 8))
READONLY_RECOVERY = ExtendedErrorCode(READONLY | (1 << 8))
READONLY_CANTLOCK = ExtendedErrorCode(READONLY | (2 << 8))
READONLY_ROLLBACK = ExtendedErrorCode(READONLY | (3 << 8))
READONLY_DBMOVED = ExtendedErrorCode(READONLY | (4 << 8))
READONLY_CANTINIT = ExtendedErrorCode(READONLY | (5 << 8))
READONLY_DIRECTORY = ExtendedErrorCode(READONLY | (6 << 8))
ABORT_ROLLBACK = ExtendedErrorCode(ABORT | (2 << 8))
CONSTRAINT_CHECK = ExtendedErrorCode(CONSTRAINT | (1 << 8))
CONSTRAINT_COMMITHOOK = ExtendedErrorCode(CONSTRAINT | (2 << 8))
CONSTRAINT_FOREIGNKEY = ExtendedErrorCode(CONSTRAINT | (3 << 8))
CONSTRAINT_FUNCTION = ExtendedErrorCode(CONSTRAINT | (4 << 8))
CONSTRAINT_NOTNULL = ExtendedErrorCode(CONSTRAINT | (5 << 8))
CONSTRAINT_PRIMARYKEY = ExtendedErrorCode(CONSTRAINT | (6 << 8))
CONSTRAINT_TRIGGER = ExtendedErrorCode(CONSTRAINT | (7 << 8))
CONSTRAINT_UNIQUE = ExtendedErrorCode(CONSTRAINT | (8 << 8))
CONSTRAINT_VTAB = ExtendedErrorCode(CONSTRAINT | (9 << 8))
CONSTRAINT_ROWID = ExtendedErrorCode(CONSTRAINT | (10 << 8))
CONSTRAINT_PINNED = ExtendedErrorCode(CONSTRAINT | (11 << 8))
CONSTRAINT_DATATYPE = ExtendedErrorCode(CONSTRAINT | (12 << 8))
NOTICE_RECOVER_WAL = ExtendedErrorCode(NOTICE | (1 << 8))
NOTICE_RECOVER_ROLLBACK = ExtendedErrorCode(NOTICE | (2 << 8))
WARNING_AUTOINDEX = ExtendedErrorCode(WARNING | (1 << 8))
AUTH_USER = ExtendedErrorCode(AUTH | (1 << 8))
ERROR_MISSING_COLLSEQ = ExtendedErrorCode(ERROR) | (1 << 8)
ERROR_RETRY = ExtendedErrorCode(ERROR) | (2 << 8)
ERROR_SNAPSHOT = ExtendedErrorCode(ERROR) | (3 << 8)
IOERR_READ = ExtendedErrorCode(IOERR) | (1 << 8)
IOERR_SHORT_READ = ExtendedErrorCode(IOERR) | (2 << 8)
IOERR_WRITE = ExtendedErrorCode(IOERR) | (3 << 8)
IOERR_FSYNC = ExtendedErrorCode(IOERR) | (4 << 8)
IOERR_DIR_FSYNC = ExtendedErrorCode(IOERR) | (5 << 8)
IOERR_TRUNCATE = ExtendedErrorCode(IOERR) | (6 << 8)
IOERR_FSTAT = ExtendedErrorCode(IOERR) | (7 << 8)
IOERR_UNLOCK = ExtendedErrorCode(IOERR) | (8 << 8)
IOERR_RDLOCK = ExtendedErrorCode(IOERR) | (9 << 8)
IOERR_DELETE = ExtendedErrorCode(IOERR) | (10 << 8)
IOERR_BLOCKED = ExtendedErrorCode(IOERR) | (11 << 8)
IOERR_NOMEM = ExtendedErrorCode(IOERR) | (12 << 8)
IOERR_ACCESS = ExtendedErrorCode(IOERR) | (13 << 8)
IOERR_CHECKRESERVEDLOCK = ExtendedErrorCode(IOERR) | (14 << 8)
IOERR_LOCK = ExtendedErrorCode(IOERR) | (15 << 8)
IOERR_CLOSE = ExtendedErrorCode(IOERR) | (16 << 8)
IOERR_DIR_CLOSE = ExtendedErrorCode(IOERR) | (17 << 8)
IOERR_SHMOPEN = ExtendedErrorCode(IOERR) | (18 << 8)
IOERR_SHMSIZE = ExtendedErrorCode(IOERR) | (19 << 8)
IOERR_SHMLOCK = ExtendedErrorCode(IOERR) | (20 << 8)
IOERR_SHMMAP = ExtendedErrorCode(IOERR) | (21 << 8)
IOERR_SEEK = ExtendedErrorCode(IOERR) | (22 << 8)
IOERR_DELETE_NOENT = ExtendedErrorCode(IOERR) | (23 << 8)
IOERR_MMAP = ExtendedErrorCode(IOERR) | (24 << 8)
IOERR_GETTEMPPATH = ExtendedErrorCode(IOERR) | (25 << 8)
IOERR_CONVPATH = ExtendedErrorCode(IOERR) | (26 << 8)
IOERR_VNODE = ExtendedErrorCode(IOERR) | (27 << 8)
IOERR_AUTH = ExtendedErrorCode(IOERR) | (28 << 8)
IOERR_BEGIN_ATOMIC = ExtendedErrorCode(IOERR) | (29 << 8)
IOERR_COMMIT_ATOMIC = ExtendedErrorCode(IOERR) | (30 << 8)
IOERR_ROLLBACK_ATOMIC = ExtendedErrorCode(IOERR) | (31 << 8)
IOERR_DATA = ExtendedErrorCode(IOERR) | (32 << 8)
IOERR_CORRUPTFS = ExtendedErrorCode(IOERR) | (33 << 8)
LOCKED_SHAREDCACHE = ExtendedErrorCode(LOCKED) | (1 << 8)
LOCKED_VTAB = ExtendedErrorCode(LOCKED) | (2 << 8)
BUSY_RECOVERY = ExtendedErrorCode(BUSY) | (1 << 8)
BUSY_SNAPSHOT = ExtendedErrorCode(BUSY) | (2 << 8)
BUSY_TIMEOUT = ExtendedErrorCode(BUSY) | (3 << 8)
CANTOPEN_NOTEMPDIR = ExtendedErrorCode(CANTOPEN) | (1 << 8)
CANTOPEN_ISDIR = ExtendedErrorCode(CANTOPEN) | (2 << 8)
CANTOPEN_FULLPATH = ExtendedErrorCode(CANTOPEN) | (3 << 8)
CANTOPEN_CONVPATH = ExtendedErrorCode(CANTOPEN) | (4 << 8)
CANTOPEN_DIRTYWAL = ExtendedErrorCode(CANTOPEN) | (5 << 8) /* Not Used */
CANTOPEN_SYMLINK = ExtendedErrorCode(CANTOPEN) | (6 << 8)
CORRUPT_VTAB = ExtendedErrorCode(CORRUPT) | (1 << 8)
CORRUPT_SEQUENCE = ExtendedErrorCode(CORRUPT) | (2 << 8)
CORRUPT_INDEX = ExtendedErrorCode(CORRUPT) | (3 << 8)
READONLY_RECOVERY = ExtendedErrorCode(READONLY) | (1 << 8)
READONLY_CANTLOCK = ExtendedErrorCode(READONLY) | (2 << 8)
READONLY_ROLLBACK = ExtendedErrorCode(READONLY) | (3 << 8)
READONLY_DBMOVED = ExtendedErrorCode(READONLY) | (4 << 8)
READONLY_CANTINIT = ExtendedErrorCode(READONLY) | (5 << 8)
READONLY_DIRECTORY = ExtendedErrorCode(READONLY) | (6 << 8)
ABORT_ROLLBACK = ExtendedErrorCode(ABORT) | (2 << 8)
CONSTRAINT_CHECK = ExtendedErrorCode(CONSTRAINT) | (1 << 8)
CONSTRAINT_COMMITHOOK = ExtendedErrorCode(CONSTRAINT) | (2 << 8)
CONSTRAINT_FOREIGNKEY = ExtendedErrorCode(CONSTRAINT) | (3 << 8)
CONSTRAINT_FUNCTION = ExtendedErrorCode(CONSTRAINT) | (4 << 8)
CONSTRAINT_NOTNULL = ExtendedErrorCode(CONSTRAINT) | (5 << 8)
CONSTRAINT_PRIMARYKEY = ExtendedErrorCode(CONSTRAINT) | (6 << 8)
CONSTRAINT_TRIGGER = ExtendedErrorCode(CONSTRAINT) | (7 << 8)
CONSTRAINT_UNIQUE = ExtendedErrorCode(CONSTRAINT) | (8 << 8)
CONSTRAINT_VTAB = ExtendedErrorCode(CONSTRAINT) | (9 << 8)
CONSTRAINT_ROWID = ExtendedErrorCode(CONSTRAINT) | (10 << 8)
CONSTRAINT_PINNED = ExtendedErrorCode(CONSTRAINT) | (11 << 8)
CONSTRAINT_DATATYPE = ExtendedErrorCode(CONSTRAINT) | (12 << 8)
NOTICE_RECOVER_WAL = ExtendedErrorCode(NOTICE) | (1 << 8)
NOTICE_RECOVER_ROLLBACK = ExtendedErrorCode(NOTICE) | (2 << 8)
WARNING_AUTOINDEX = ExtendedErrorCode(WARNING) | (1 << 8)
AUTH_USER = ExtendedErrorCode(AUTH) | (1 << 8)
)
type OpenFlag uint

View File

@@ -4,18 +4,11 @@ set -eo pipefail
cd -P -- "$(dirname -- "$0")"
# download SQLite
if [ ! -f "sqlite3/sqlite3.c" ]; then
url="https://www.sqlite.org/2022/sqlite-amalgamation-3400100.zip"
curl "$url" > sqlite3/sqlite.zip
unzip -d sqlite3/ sqlite3/sqlite.zip
mv sqlite3/sqlite-amalgamation-*/sqlite3* sqlite3/
rm -rf sqlite3/sqlite-amalgamation-*
rm sqlite3/sqlite.zip
fi
../sqlite3/download.sh
# build SQLite
zig cc --target=wasm32-wasi -flto -g0 -O2 \
-o embed/sqlite3.wasm sqlite3/*.c \
-o sqlite3.wasm ../sqlite3/*.c \
-mmutable-globals \
-mbulk-memory -mreference-types \
-mnontrapping-fptoint -msign-ext \
@@ -27,15 +20,18 @@ zig cc --target=wasm32-wasi -flto -g0 -O2 \
-DSQLITE_DEFAULT_LOCKING_MODE=1 \
-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 \
-DSQLITE_LIKE_DOESNT_MATCH_BLOBS \
-DSQLITE_MAX_EXPR_DEPTH=0 \
-DSQLITE_OMIT_DECLTYPE \
-DSQLITE_OMIT_DEPRECATED \
-DSQLITE_OMIT_PROGRESS_CALLBACK \
-DSQLITE_OMIT_SHARED_CACHE \
-DSQLITE_OMIT_AUTOINIT \
-DSQLITE_OMIT_UTF16 \
-DSQLITE_USE_ALLOCA \
-Wl,--export=malloc \
-Wl,--export=free \
-Wl,--export=malloc_destructor \
-Wl,--export=sqlite3_errcode \
-Wl,--export=sqlite3_errstr \
-Wl,--export=sqlite3_errmsg \
-Wl,--export=sqlite3_error_offset \

View File

@@ -12,7 +12,7 @@ type Error struct {
msg string
}
func (e Error) Error() string {
func (e *Error) Error() string {
var b strings.Builder
b.WriteString("sqlite3: ")

13
sqlite3/download.sh Executable file
View File

@@ -0,0 +1,13 @@
#!/usr/bin/env bash
set -eo pipefail
cd -P -- "$(dirname -- "$0")"
if [ ! -f "sqlite3.c" ]; then
url="https://www.sqlite.org/2022/sqlite-amalgamation-3400100.zip"
curl "$url" > sqlite.zip
unzip -d . sqlite.zip
mv sqlite-amalgamation-*/sqlite3* .
rm -rf sqlite-amalgamation-*
rm sqlite.zip
fi

18
stmt.go
View File

@@ -7,6 +7,7 @@ import (
type Stmt struct {
c *Conn
handle uint32
err error
}
func (s *Stmt) Close() error {
@@ -27,18 +28,25 @@ func (s *Stmt) Reset() error {
return s.c.error(r[0])
}
func (s *Stmt) Step() (row bool, err error) {
func (s *Stmt) Step() bool {
r, err := s.c.api.step.Call(s.c.ctx, uint64(s.handle))
if err != nil {
return false, err
s.err = err
return false
}
if r[0] == _ROW {
return true, nil
return true
}
if r[0] == _DONE {
return false, nil
s.err = nil
} else {
s.err = s.c.error(r[0])
}
return false, s.c.error(r[0])
return false
}
func (s *Stmt) Err() error {
return s.err
}
func (s *Stmt) BindBool(param int, value bool) error {