sqlite: map the full practical C API
src/db/sqlite.sx grows from the P5.1 subset (~19 fns) to the complete practical surface (~100): open_v2 + flags, extended errcodes + error_offset, txn_state/autocommit, changes64/total_changes64, limits, the full bind/column families (double/blob/zeroblob), parameter and column introspection (built with SQLITE_ENABLE_COLUMN_METADATA), table_column_metadata, statement introspection (sql/expanded_sql/ readonly/busy/isexplain/status), incremental blob I/O (SqliteBlob), online backup (SqliteBackup + sqlite_backup_run), serialize/ deserialize, and library utilities (complete, strglob/strlike/stricmp, randomness, memory, compileoptions). One variant per duplicate family (modern/64-bit preferred; bind_text/blob keep the 32-bit length forms that skip text64's encoding arg). Not bound, by design: callback-taking APIs (hooks/UDFs/collations need C->sx callbacks), sqlite3_value_* (UDF-coupled), varargs config, UTF-16, and subsystems this build omits — the boundary list lives in the module header and vendor README. rename.h is now GENERATED by make into build/vendor/ from the bindings' #foreign names — src/db/sqlite.sx is the single source of truth and the rename list cannot drift (checked-in vendor/sqlite/rename.h removed). make test 21/21 (new: sqlite_api.sx — 15 cases over every wrapper family, including a blob round trip with interior NULs, UNIQUE constraint extended errcodes, txn_state through BEGIN IMMEDIATE, backup db->db, and a serialize->deserialize round trip). KNOWN sx BOUNDARY (filed as a followup): 'if !e' on an error binding evaluates true even when the error is set — negated error logic in tests routes through plain bools.
This commit is contained in:
18
Makefile
18
Makefile
@@ -16,19 +16,29 @@ DIST := src/dist.sx
|
||||
# products in two DIRECTORIES — the macOS linker prefers a dylib over an
|
||||
# archive in the same -L directory, and `sx build` must link the static
|
||||
# copy while `sx run` (the test runner) dlopens the dylib.
|
||||
#
|
||||
# rename.h is GENERATED from the bindings: every `dist_sqlite3_*` symbol
|
||||
# named in src/db/sqlite.sx gets a #define, so the rename list and the
|
||||
# bound surface cannot drift (see the README for why renaming exists).
|
||||
VENDOR_DIR := $(BUILD_DIR)/vendor
|
||||
SQLITE_SRC := vendor/sqlite/sqlite3.c
|
||||
SQLITE_DEFS := -DSQLITE_DQS=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_MEMSTATUS=0 \
|
||||
-DSQLITE_OMIT_DEPRECATED -DSQLITE_OMIT_SHARED_CACHE \
|
||||
-DSQLITE_LIKE_DOESNT_MATCH_BLOBS \
|
||||
-include vendor/sqlite/rename.h
|
||||
-DSQLITE_LIKE_DOESNT_MATCH_BLOBS -DSQLITE_ENABLE_COLUMN_METADATA \
|
||||
-include $(VENDOR_DIR)/rename.h
|
||||
|
||||
$(VENDOR_DIR)/libsqlite3.a: $(SQLITE_SRC) vendor/sqlite/sqlite3.h vendor/sqlite/rename.h
|
||||
$(VENDOR_DIR)/rename.h: src/db/sqlite.sx
|
||||
@mkdir -p $(VENDOR_DIR)
|
||||
@{ echo '/* GENERATED by make from src/db/sqlite.sx — do not edit. */'; \
|
||||
grep -o '"dist_sqlite3_[a-z0-9_]*"' src/db/sqlite.sx | tr -d '"' | sort -u | \
|
||||
sed 's/^dist_\(.*\)/#define \1 dist_\1/'; } > $@
|
||||
|
||||
$(VENDOR_DIR)/libsqlite3.a: $(SQLITE_SRC) vendor/sqlite/sqlite3.h $(VENDOR_DIR)/rename.h
|
||||
@mkdir -p $(VENDOR_DIR)
|
||||
cc $(SQLITE_DEFS) -O2 -c $(SQLITE_SRC) -o $(VENDOR_DIR)/sqlite3.o
|
||||
ar rcs $@ $(VENDOR_DIR)/sqlite3.o
|
||||
|
||||
$(VENDOR_DIR)/jit/libsqlite3.dylib: $(SQLITE_SRC) vendor/sqlite/sqlite3.h vendor/sqlite/rename.h
|
||||
$(VENDOR_DIR)/jit/libsqlite3.dylib: $(SQLITE_SRC) vendor/sqlite/sqlite3.h $(VENDOR_DIR)/rename.h
|
||||
@mkdir -p $(VENDOR_DIR)/jit
|
||||
cc $(SQLITE_DEFS) -O2 -dynamiclib $(SQLITE_SRC) -o $@
|
||||
|
||||
|
||||
Reference in New Issue
Block a user