From 632ea933b3fddf6d38a7f8e2b7cf8a431d784e80 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Tue, 4 Jul 2023 02:18:03 +0100 Subject: [PATCH] Function aux data. --- context.go | 16 +++++++++++ embed/exports.txt | 10 ++++--- embed/sqlite3.wasm | Bin 1431762 -> 1432427 bytes func_test.go | 62 ++++++++++++++++++++++++++++++++++++++++ internal/util/handle.go | 2 +- module.go | 12 +++++--- sqlite3/func.c | 12 +++++--- 7 files changed, 101 insertions(+), 13 deletions(-) diff --git a/context.go b/context.go index 7f59b26..5d04f5f 100644 --- a/context.go +++ b/context.go @@ -16,6 +16,22 @@ type Context struct { handle uint32 } +// SetAuxData saves metadata for argument n of the function. +// +// https://www.sqlite.org/c3ref/get_auxdata.html +func (c Context) SetAuxData(n int, data any) { + ptr := util.AddHandle(c.ctx, data) + c.call(c.api.setAuxData, uint64(c.handle), uint64(n), uint64(ptr)) +} + +// GetAuxData returns metadata for argument n of the function. +// +// https://www.sqlite.org/c3ref/get_auxdata.html +func (c Context) GetAuxData(n int) any { + ptr := uint32(c.call(c.api.getAuxData, uint64(c.handle), uint64(n))) + return util.GetHandle(c.ctx, ptr) +} + // ResultBool sets the result of the function to a bool. // SQLite does not have a separate boolean storage class. // Instead, boolean values are stored as integers 0 (false) and 1 (true). diff --git a/embed/exports.txt b/embed/exports.txt index 45418fa..94bfa66 100644 --- a/embed/exports.txt +++ b/embed/exports.txt @@ -48,12 +48,14 @@ sqlite3_changes64 sqlite3_last_insert_rowid sqlite3_get_autocommit sqlite3_anycollseq_init -sqlite3_create_go_collation -sqlite3_create_go_function -sqlite3_create_go_aggregate_function -sqlite3_create_go_window_function +sqlite3_create_collation_go +sqlite3_create_function_go +sqlite3_create_aggregate_function_go +sqlite3_create_window_function_go sqlite3_aggregate_context sqlite3_user_data +sqlite3_set_auxdata_go +sqlite3_get_auxdata sqlite3_value_type sqlite3_value_int64 sqlite3_value_double diff --git a/embed/sqlite3.wasm b/embed/sqlite3.wasm index 4dd5c40efe15d75546a90e14df3d59ac3deab1fb..7260b425349acdb0fe0cb0487529c4e5c2c9f5a9 100755 GIT binary patch delta 25874 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 a35cQZFI3F%{YeQc{-lI{Zj0-A*#8HZ*ozPV delta 25230 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 JcK2VQ{}0o|MeqOs diff --git a/func_test.go b/func_test.go index d6cb53f..e9f6489 100644 --- a/func_test.go +++ b/func_test.go @@ -4,6 +4,7 @@ import ( "bytes" "fmt" "log" + "regexp" "golang.org/x/text/collate" "golang.org/x/text/language" @@ -117,3 +118,64 @@ func ExampleConn_CreateFunction() { // COTÉE // COTER } + +func ExampleContext_SetAuxData() { + db, err := sqlite3.Open(":memory:") + if err != nil { + log.Fatal(err) + } + + err = db.Exec(`CREATE TABLE IF NOT EXISTS words (word VARCHAR(10))`) + if err != nil { + log.Fatal(err) + } + + err = db.Exec(`INSERT INTO words (word) VALUES ('côte'), ('cote'), ('coter'), ('coté'), ('cotée'), ('côté')`) + if err != nil { + log.Fatal(err) + } + + err = db.CreateFunction("regexp", 2, sqlite3.DETERMINISTIC|sqlite3.INNOCUOUS, func(ctx sqlite3.Context, arg ...sqlite3.Value) { + re, ok := ctx.GetAuxData(0).(*regexp.Regexp) + if !ok { + r, err := regexp.Compile(arg[0].Text()) + if err != nil { + ctx.ResultError(err) + return + } + ctx.SetAuxData(0, r) + re = r + } + ctx.ResultBool(re.Match(arg[1].RawText())) + }) + if err != nil { + log.Fatal(err) + } + + stmt, _, err := db.Prepare(`SELECT word FROM words WHERE word REGEXP '^\p{L}+e$'`) + if err != nil { + log.Fatal(err) + } + defer stmt.Close() + + for stmt.Step() { + fmt.Println(stmt.ColumnText(0)) + } + if err := stmt.Err(); err != nil { + log.Fatal(err) + } + + err = stmt.Close() + if err != nil { + log.Fatal(err) + } + + err = db.Close() + if err != nil { + log.Fatal(err) + } + // Unordered output: + // cote + // côte + // cotée +} diff --git a/internal/util/handle.go b/internal/util/handle.go index 20444a0..6aa1dc7 100644 --- a/internal/util/handle.go +++ b/internal/util/handle.go @@ -29,7 +29,7 @@ func (s *handleState) Close() (err error) { func GetHandle(ctx context.Context, id uint32) any { if id == 0 { - panic(NilErr) + return nil } s := ctx.Value(handleKey{}).(*handleState) return s.handles[^id] diff --git a/module.go b/module.go index 725f6da..e92525b 100644 --- a/module.go +++ b/module.go @@ -158,12 +158,14 @@ func newSQLite(mod api.Module) (sqlt *sqlite, err error) { changes: getFun("sqlite3_changes64"), lastRowid: getFun("sqlite3_last_insert_rowid"), autocommit: getFun("sqlite3_get_autocommit"), - createCollation: getFun("sqlite3_create_go_collation"), - createFunction: getFun("sqlite3_create_go_function"), - createAggregate: getFun("sqlite3_create_go_aggregate_function"), - createWindow: getFun("sqlite3_create_go_window_function"), + createCollation: getFun("sqlite3_create_collation_go"), + createFunction: getFun("sqlite3_create_function_go"), + createAggregate: getFun("sqlite3_create_aggregate_function_go"), + createWindow: getFun("sqlite3_create_window_function_go"), aggregateCtx: getFun("sqlite3_aggregate_context"), userData: getFun("sqlite3_user_data"), + setAuxData: getFun("sqlite3_set_auxdata_go"), + getAuxData: getFun("sqlite3_get_auxdata"), valueType: getFun("sqlite3_value_type"), valueInteger: getFun("sqlite3_value_int64"), valueFloat: getFun("sqlite3_value_double"), @@ -381,6 +383,8 @@ type sqliteAPI struct { createWindow api.Function aggregateCtx api.Function userData api.Function + setAuxData api.Function + getAuxData api.Function valueType api.Function valueInteger api.Function valueFloat api.Function diff --git a/sqlite3/func.c b/sqlite3/func.c index 89a4712..80e4981 100644 --- a/sqlite3/func.c +++ b/sqlite3/func.c @@ -10,27 +10,31 @@ void go_value(sqlite3_context *); void go_inverse(sqlite3_context *, int, sqlite3_value **); void go_destroy(void *); -int sqlite3_create_go_collation(sqlite3 *db, const char *zName, void *pApp) { +int sqlite3_create_collation_go(sqlite3 *db, const char *zName, void *pApp) { return sqlite3_create_collation_v2(db, zName, SQLITE_UTF8, pApp, go_compare, go_destroy); } -int sqlite3_create_go_function(sqlite3 *db, const char *zName, int nArg, +int sqlite3_create_function_go(sqlite3 *db, const char *zName, int nArg, int flags, void *pApp) { return sqlite3_create_function_v2(db, zName, nArg, SQLITE_UTF8 | flags, pApp, go_func, NULL, NULL, go_destroy); } -int sqlite3_create_go_aggregate_function(sqlite3 *db, const char *zName, +int sqlite3_create_aggregate_function_go(sqlite3 *db, const char *zName, int nArg, int flags, void *pApp) { return sqlite3_create_window_function(db, zName, nArg, SQLITE_UTF8 | flags, pApp, go_step, go_final, NULL, NULL, go_destroy); } -int sqlite3_create_go_window_function(sqlite3 *db, const char *zName, int nArg, +int sqlite3_create_window_function_go(sqlite3 *db, const char *zName, int nArg, int flags, void *pApp) { return sqlite3_create_window_function(db, zName, nArg, SQLITE_UTF8 | flags, pApp, go_step, go_final, go_value, go_inverse, go_destroy); } + +void sqlite3_set_auxdata_go(sqlite3_context *ctx, int iArg, void *pAux) { + sqlite3_set_auxdata(ctx, iArg, pAux, go_destroy); +}