Hello !  

Also there is no way to link the callback to specific statement, I think that
an extra parameter with the whole sql statement would be needed and/or any
other way to link several calls to a statement.  

Maybe something like:  int sqlite3_set_authorizer(    sqlite3*,    int
(*xAuth)(void*,int,const char *sql_been_prepared, const char*,const
char*,const char*,const char*),    void *pUserData  );

That way we can link successive calls to "sql_been_prepared" and know when a
new one starts/ends. Otherwise it's not clear how to use this correctly.

Bellow is an example to test the sqlite3_authorizer with it's output:

====== pseudo code (scripting using https://github.com/mingodad/squilu)
local db_file_name = ":memory:";
local db = SQLite3(db_file_name);

local function authorizer_hook(udata, action_code, param3, param4, param5,
param6)
{
 print(action_code, param3 || "null", param4 || "null", param5 || "null",
param6 || "null");
 return db.SQLITE_OK;
}
db.set_authorizer(authorizer_hook, "all");

db.exec_dml("DROP TABLE IF EXISTS test;");
db.exec_dml("DROP VIEW IF EXISTS test_view;");
db.exec_dml("CREATE TABLE  test(id integer primary key, key varchar not null,
value varchar not null check(length(value) > 2), unique(key));");
db.exec_dml("CREATE VIEW test_view AS SELECT * FROM test;");
db.exec_dml("BEGIN;");
local stmt = db.prepare("INSERT INTO test(key, value) VALUES(?,?);");
stmt.bind(1, "key_1");
stmt.bind(2, "value_1");
stmt.step();
stmt.reset();
stmt.finalize();
db.exec_dml("COMMIT;");

stmt = db.prepare("SELECT * FROM test_view WHERE id = ?;");
stmt.bind(1,  1);
stmt.step();
stmt.reset();
stmt.finalize();

stmt = db.prepare("SELECT * FROM test WHERE key = ?;");
stmt.bind(1, "key_1");
stmt.step();
stmt.reset();
stmt.finalize();

stmt = db.prepare("SELECT * FROM test WHERE value = ? limit 1;");
stmt.bind(1, "value_1");
stmt.step();
stmt.reset();
stmt.finalize();

db.exec_dml("CREATE INDEX test_values_idx ON test(value);");

stmt = db.prepare("SELECT * FROM sqlite_master;");
stmt.finalize();

db.close();
======

======output of the above script
18 sqlite_master null main null
2 test null main null
18 sqlite_master null main null
1 sqlite_autoindex_test_1 test main null
18 sqlite_master null main null
31 null length null null
20 test value main null
23 sqlite_master type main null
23 sqlite_master name main null
23 sqlite_master tbl_name main null
23 sqlite_master rootpage main null
23 sqlite_master sql main null
20 sqlite_master ROWID main null
20 sqlite_master name main null
20 sqlite_master rootpage main null
20 sqlite_master sql main null
20 sqlite_master tbl_name main null
20 sqlite_master type main null
20 sqlite_master ROWID main null
20 test value main null
18 sqlite_master null main null
8 test_view null main null
23 sqlite_master type main null
23 sqlite_master name main null
23 sqlite_master tbl_name main null
23 sqlite_master rootpage main null
23 sqlite_master sql main null
20 sqlite_master ROWID main null
20 sqlite_master name main null
20 sqlite_master rootpage main null
20 sqlite_master sql main null
20 sqlite_master tbl_name main null
20 sqlite_master type main null
20 sqlite_master ROWID main null
22 BEGIN null null null
18 test null main null
22 COMMIT null null null
21 null null null null
20 test id main test_view
20 test key main test_view
20 test value main test_view
20 test_view id main null
20 test_view key main null
20 test_view value main null
20 test_view id main null
21 null null null test_view
21 null null null null
20 test id main null
20 test key main null
20 test value main null
20 test key main null
21 null null null null
20 test id main null
20 test key main null
20 test value main null
20 test value main null
18 sqlite_master null main null
1 test_values_idx test main null
18 sqlite_master null main null
27 test_values_idx null main null
20 sqlite_master name main null
20 sqlite_master rootpage main null
20 sqlite_master sql main null
20 sqlite_master name main null
20 sqlite_master type main null
20 sqlite_master ROWID main null
21 null null null null
20 sqlite_master type main null
20 sqlite_master name main null
20 sqlite_master tbl_name main null
20 sqlite_master rootpage main null
20 sqlite_master sql main null
======  

?

Reply via email to