# Be explicit about which Java files to compile so that we can work on
# in-progress files without requiring them to be in a compilable statae.
JAVA_FILES.main := $(patsubst %,$(dir.src.jni)/%,\
- BusyHandler.java \
- Collation.java \
- CollationNeeded.java \
- CommitHook.java \
+ authorizer_callback.java \
+ auto_extension_callback.java \
+ busy_handler_callback.java \
+ collation_callback.java \
+ collation_needed_callback.java \
+ commit_hook_callback.java \
+ config_sqllog_callback.java \
+ preupdate_hook_callback.java \
+ progress_handler_callback.java \
+ rollback_hook_callback.java \
+ trace_v2_callback.java \
+ update_hook_callback.java \
NativePointerHolder.java \
NotNull.java \
Nullable.java \
OutputPointer.java \
- package-info.java \
- ProgressHandler.java \
ResultCode.java \
- RollbackHook.java \
SQLFunction.java \
- SQLLog.java \
- sqlite3_context.java \
- sqlite3.java \
SQLite3Jni.java \
- sqlite3_stmt.java \
- sqlite3_value.java \
Tester1.java \
- Tracer.java \
- UpdateHook.java \
ValueHolder.java \
+ package-info.java \
+ sqlite3.java \
+ sqlite3_context.java \
+ sqlite3_stmt.java \
+ sqlite3_value.java \
+ sqlite3_xDestroy_callback.java \
)
ifeq (1,$(enable.fts5))
JAVA_FILES.main += $(patsubst %,$(dir.src.jni)/%,\
semantics of the APIs.
-Awkward Callback Names
-------------------------------------------------------------------------
-
-In places where the Java interface uses callbacks (see below), those
-callbacks often have what might fairly be labeled as awkward names,
-e.g. `sqlScalarFunction.xFunc()` and `preupdateHook.xPreUpdate()`.
-Those names were chosen because they match the corresponding arguments
-in the C-level API docs. If they were renamed to be more Java-esque,
-documentation transparency would suffer.
-
-
Unwieldy Constructs are Re-mapped
------------------------------------------------------------------------
```java
int sqlite3_create_collation(sqlite3 db, String name, int eTextRep,
- Collation collation);
+ SomeCallbackType collation);
```
-Where the `Collation` class has an abstract `xCompare()` method and
+Where the `Collation` class has an abstract `call()` method and
no-op `xDestroy()` method which can be overridden if needed, leading to
a much more Java-esque usage:
```java
-int rc = sqlite3_create_collation(db, "mycollation", SQLITE_UTF8, new Collation(){
+int rc = sqlite3_create_collation(db, "mycollation", SQLITE_UTF8, new SomeCallbackType(){
// Required comparison function:
- @Override public int xCompare(byte[] lhs, byte[] rhs){ ... }
+ @Override public int call(byte[] lhs, byte[] rhs){ ... }
// Optional finalizer function:
@Override public void xDestroy(){ ... }
} metrics;
/**
The list of bound auto-extensions (Java-side:
- org.sqlite.jni.AutoExtension objects).
+ org.sqlite.jni.auto_extension objects).
*/
struct {
S3JniAutoExtension *pExt /* Head of the auto-extension list */;
UNHOOK(preUpdate, 0);
#endif
UNHOOK(collation, 1);
- UNHOOK(collationNeeded, 1);
+ UNHOOK(collationNeeded, 0);
UNHOOK(busyHandler, 1);
#undef UNHOOK
UNREF_G(s->jDb);
jobject const jAutoExt){
jclass const klazz = (*env)->GetObjectClass(env, jAutoExt);
- ax->midFunc = (*env)->GetMethodID(env, klazz, "xEntryPoint",
+ ax->midFunc = (*env)->GetMethodID(env, klazz, "call",
"(Lorg/sqlite/jni/sqlite3;)I");
UNREF_L(klazz);
S3JniExceptionWarnIgnore;
if( !ax->midFunc ){
- MARKER(("Error getting xEntryPoint(sqlite3) from AutoExtension object."));
+ MARKER(("Error getting call(sqlite3) from AutoExtension object.\n"));
S3JniAutoExtension_clear(env, ax);
return SQLITE_ERROR;
}
S3JniHook_unref(env, pHook, 1);
pHook->jObj = REF_G(jBusy);
klazz = (*env)->GetObjectClass(env, jBusy);
- pHook->midCallback = (*env)->GetMethodID(env, klazz, "xCallback", "(I)I");
+ pHook->midCallback = (*env)->GetMethodID(env, klazz, "call", "(I)I");
UNREF_L(klazz);
S3JniIfThrew {
S3JniHook_unref(env, pHook, 0);
return 0;
}
klazz = (*env)->GetObjectClass(env, jHook);
- xCallback = (*env)->GetMethodID(env, klazz, "xCollationNeeded",
+ xCallback = (*env)->GetMethodID(env, klazz, "call",
"(Lorg/sqlite/jni/sqlite3;ILjava/lang/String;)I");
UNREF_L(klazz);
S3JniIfThrew {
return pOld;
}
klazz = (*env)->GetObjectClass(env, jHook);
- xCallback = (*env)->GetMethodID(env, klazz,
- isCommit ? "xCommitHook" : "xRollbackHook",
+ xCallback = (*env)->GetMethodID(env, klazz, "call",
isCommit ? "()I" : "()V");
UNREF_L(klazz);
S3JniIfThrew {
return 0;
}
klazz = (*env)->GetObjectClass(env, jLog);
- hook->midCallback = (*env)->GetMethodID(env, klazz, "xSqllog",
+ hook->midCallback = (*env)->GetMethodID(env, klazz, "call",
"(Lorg/sqlite/jni/sqlite3;"
"Ljava/lang/String;"
"I)V");
if( !pHook ) return SQLITE_MISUSE;
klazz = (*env)->GetObjectClass(env, oCollation);
- pHook->midCallback = (*env)->GetMethodID(env, klazz, "xCompare",
+ pHook->midCallback = (*env)->GetMethodID(env, klazz, "call",
"([B[B)I");
UNREF_L(klazz);
S3JniIfThrew{
}
klazz = (*env)->GetObjectClass(env, jHook);
xCallback = isPre
- ? (*env)->GetMethodID(env, klazz, "xPreUpdate",
+ ? (*env)->GetMethodID(env, klazz, "call",
"(Lorg/sqlite/jni/sqlite3;"
"I"
"Ljava/lang/String;"
"Ljava/lang/String;"
"JJ)V")
- : (*env)->GetMethodID(env, klazz, "xUpdateHook",
+ : (*env)->GetMethodID(env, klazz, "call",
"(ILjava/lang/String;Ljava/lang/String;J)V");
UNREF_L(klazz);
S3JniIfThrew {
return;
}
klazz = (*env)->GetObjectClass(env, jProgress);
- xCallback = (*env)->GetMethodID(env, klazz, "xCallback", "()I");
+ xCallback = (*env)->GetMethodID(env, klazz, "call", "()I");
UNREF_L(klazz);
S3JniIfThrew {
S3JniExceptionClear;
pHook->jObj = REF_G(jHook);
klazz = (*env)->GetObjectClass(env, jHook);
pHook->midCallback = (*env)->GetMethodID(env, klazz,
- "xAuth",
+ "call",
"(I"
"Ljava/lang/String;"
"Ljava/lang/String;"
JniArgsEnvClass,jobject jDb, jint traceMask, jobject jTracer
){
S3JniDb * const ps = S3JniDb_for_db(env, jDb, 0);
+ S3JniHook * const pHook = ps ? &ps->hooks.trace : 0;
jclass klazz;
- if( !traceMask || !jTracer ){
- if( ps ){
- S3JniHook_unref(env, &ps->hooks.trace, 0);
- }
+ if( !ps ) return SQLITE_MISUSE;
+ else if( !traceMask || !jTracer ){
+ S3JniHook_unref(env, pHook, 0);
return (jint)sqlite3_trace_v2(ps->pDb, 0, 0, 0);
}
- if( !ps ) return SQLITE_NOMEM;
klazz = (*env)->GetObjectClass(env, jTracer);
- ps->hooks.trace.midCallback = (*env)->GetMethodID(env, klazz, "xCallback",
- "(ILjava/lang/Object;Ljava/lang/Object;)I");
+ pHook->midCallback = (*env)->GetMethodID(
+ env, klazz, "call", "(ILjava/lang/Object;Ljava/lang/Object;)I"
+ );
UNREF_L(klazz);
S3JniIfThrew {
S3JniExceptionClear;
+ S3JniHook_unref(env, pHook, 0);
return s3jni_db_error(ps->pDb, SQLITE_ERROR,
"Cannot not find matching xCallback() on Tracer object.");
}
- ps->hooks.trace.jObj = REF_G(jTracer);
+ pHook->jObj = REF_G(jTracer);
return sqlite3_trace_v2(ps->pDb, (unsigned)traceMask, s3jni_trace_impl, ps);
}
/*
* Class: org_sqlite_jni_SQLite3Jni
* Method: sqlite3_auto_extension
- * Signature: (Lorg/sqlite/jni/AutoExtension;)I
+ * Signature: (Lorg/sqlite/jni/auto_extension_callback;)I
*/
JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1auto_1extension
(JNIEnv *, jclass, jobject);
/*
* Class: org_sqlite_jni_SQLite3Jni
* Method: sqlite3_busy_handler
- * Signature: (Lorg/sqlite/jni/sqlite3;Lorg/sqlite/jni/BusyHandler;)I
+ * Signature: (Lorg/sqlite/jni/sqlite3;Lorg/sqlite/jni/busy_handler_callback;)I
*/
JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1busy_1handler
(JNIEnv *, jclass, jobject, jobject);
/*
* Class: org_sqlite_jni_SQLite3Jni
* Method: sqlite3_cancel_auto_extension
- * Signature: (Lorg/sqlite/jni/AutoExtension;)Z
+ * Signature: (Lorg/sqlite/jni/auto_extension_callback;)Z
*/
JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1cancel_1auto_1extension
(JNIEnv *, jclass, jobject);
/*
* Class: org_sqlite_jni_SQLite3Jni
* Method: sqlite3_collation_needed
- * Signature: (Lorg/sqlite/jni/sqlite3;Lorg/sqlite/jni/CollationNeeded;)I
+ * Signature: (Lorg/sqlite/jni/sqlite3;Lorg/sqlite/jni/collation_needed_callback;)I
*/
JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1collation_1needed
(JNIEnv *, jclass, jobject, jobject);
/*
* Class: org_sqlite_jni_SQLite3Jni
* Method: sqlite3_commit_hook
- * Signature: (Lorg/sqlite/jni/sqlite3;Lorg/sqlite/jni/CommitHook;)Lorg/sqlite/jni/CommitHook;
+ * Signature: (Lorg/sqlite/jni/sqlite3;Lorg/sqlite/jni/commit_hook_callback;)Lorg/sqlite/jni/commit_hook_callback;
*/
JNIEXPORT jobject JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1commit_1hook
(JNIEnv *, jclass, jobject, jobject);
/*
* Class: org_sqlite_jni_SQLite3Jni
* Method: sqlite3_config
- * Signature: (Lorg/sqlite/jni/SQLLog;)I
+ * Signature: (Lorg/sqlite/jni/config_sqllog_callback;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1config__Lorg_sqlite_jni_SQLLog_2
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1config__Lorg_sqlite_jni_config_1sqllog_1callback_2
(JNIEnv *, jclass, jobject);
/*
* Class: org_sqlite_jni_SQLite3Jni
* Method: sqlite3_create_collation
- * Signature: (Lorg/sqlite/jni/sqlite3;Ljava/lang/String;ILorg/sqlite/jni/Collation;)I
+ * Signature: (Lorg/sqlite/jni/sqlite3;Ljava/lang/String;ILorg/sqlite/jni/collation_callback;)I
*/
JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1create_1collation
(JNIEnv *, jclass, jobject, jstring, jint, jobject);
/*
* Class: org_sqlite_jni_SQLite3Jni
* Method: sqlite3_preupdate_hook
- * Signature: (Lorg/sqlite/jni/sqlite3;Lorg/sqlite/jni/PreUpdateHook;)Lorg/sqlite/jni/PreUpdateHook;
+ * Signature: (Lorg/sqlite/jni/sqlite3;Lorg/sqlite/jni/preupdate_hook_callback;)Lorg/sqlite/jni/preupdate_hook_callback;
*/
JNIEXPORT jobject JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1preupdate_1hook
(JNIEnv *, jclass, jobject, jobject);
/*
* Class: org_sqlite_jni_SQLite3Jni
* Method: sqlite3_progress_handler
- * Signature: (Lorg/sqlite/jni/sqlite3;ILorg/sqlite/jni/ProgressHandler;)V
+ * Signature: (Lorg/sqlite/jni/sqlite3;ILorg/sqlite/jni/progress_handler_callback;)V
*/
JNIEXPORT void JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1progress_1handler
(JNIEnv *, jclass, jobject, jint, jobject);
/*
* Class: org_sqlite_jni_SQLite3Jni
* Method: sqlite3_rollback_hook
- * Signature: (Lorg/sqlite/jni/sqlite3;Lorg/sqlite/jni/RollbackHook;)Lorg/sqlite/jni/RollbackHook;
+ * Signature: (Lorg/sqlite/jni/sqlite3;Lorg/sqlite/jni/rollback_hook_callback;)Lorg/sqlite/jni/rollback_hook_callback;
*/
JNIEXPORT jobject JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1rollback_1hook
(JNIEnv *, jclass, jobject, jobject);
/*
* Class: org_sqlite_jni_SQLite3Jni
* Method: sqlite3_set_authorizer
- * Signature: (Lorg/sqlite/jni/sqlite3;Lorg/sqlite/jni/Authorizer;)I
+ * Signature: (Lorg/sqlite/jni/sqlite3;Lorg/sqlite/jni/authorizer_callback;)I
*/
JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1set_1authorizer
(JNIEnv *, jclass, jobject, jobject);
/*
* Class: org_sqlite_jni_SQLite3Jni
* Method: sqlite3_trace_v2
- * Signature: (Lorg/sqlite/jni/sqlite3;ILorg/sqlite/jni/Tracer;)I
+ * Signature: (Lorg/sqlite/jni/sqlite3;ILorg/sqlite/jni/trace_v2_callback;)I
*/
JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1trace_1v2
(JNIEnv *, jclass, jobject, jint, jobject);
/*
* Class: org_sqlite_jni_SQLite3Jni
* Method: sqlite3_update_hook
- * Signature: (Lorg/sqlite/jni/sqlite3;Lorg/sqlite/jni/UpdateHook;)Lorg/sqlite/jni/UpdateHook;
+ * Signature: (Lorg/sqlite/jni/sqlite3;Lorg/sqlite/jni/update_hook_callback;)Lorg/sqlite/jni/update_hook_callback;
*/
JNIEXPORT jobject JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1update_1hook
(JNIEnv *, jclass, jobject, jobject);
+++ /dev/null
-/*
-** 2023-08-23
-**
-** The author disclaims copyright to this source code. In place of
-** a legal notice, here is a blessing:
-**
-** May you do good and not evil.
-** May you find forgiveness for yourself and forgive others.
-** May you share freely, never taking more than you give.
-**
-*************************************************************************
-** This file is part of the JNI bindings for the sqlite3 C API.
-*/
-package org.sqlite.jni;
-
-/**
- A callback for use with sqlite3_preupdate_hook().
-*/
-public interface PreUpdateHook {
- /**
- Must function as described for the sqlite3_preupdate_hook().
- callback, with the slight signature change.
-
- Must not throw. Any exceptions may emit debugging messages and
- will be suppressed.
- */
- void xPreUpdate(sqlite3 db, int op, String dbName, String dbTable,
- long iKey1, long iKey2 );
-}
import java.lang.annotation.ElementType;
/**
- This class contains the entire sqlite3 JNI API binding. For
- client-side use, a static import is recommended:
+ This class contains the entire C-style sqlite3 JNI API binding,
+ minus a few bits and pieces declared in other files. For client-side
+ use, a static import is recommended:
<pre>{@code
import static org.sqlite.jni.SQLite3Jni.*;
<p><a href="https://sqlite.org/c3ref/intro.html">https://sqlite.org/c3ref/intro.html</a>
- <p>A handful of Java-specific APIs have been added.
-
+ <p>A handful of Java-specific APIs have been added which are documented
+ here.
<p>Notes regarding Java's Modified UTF-8 vs standard UTF-8:
<p>See the AutoExtension class docs for more information.
*/
- public static native int sqlite3_auto_extension(@NotNull AutoExtension callback);
+ public static native int sqlite3_auto_extension(@NotNull auto_extension_callback callback);
/**
Results are undefined if data is not null and n<0 || n>=data.length.
/**
Requires that data be null or in UTF-16 encoding in platform byte
order. Returns the result of the C-level sqlite3_bind_null() or
- sqlite3_bind_text().
+ sqlite3_bind_text16().
*/
public static int sqlite3_bind_text16(
@NotNull sqlite3_stmt stmt, int ndx, @Nullable byte[] data
);
/**
- As for the C-level function of the same name, with a BusyHandler
+ As for the C-level function of the same name, with a busy_handler_callback
instance in place of a callback function. Pass it a null handler
to clear the busy handler.
*/
public static native int sqlite3_busy_handler(
- @NotNull sqlite3 db, @Nullable BusyHandler handler
+ @NotNull sqlite3 db, @Nullable busy_handler_callback handler
);
public static native int sqlite3_busy_timeout(
);
public static native boolean sqlite3_cancel_auto_extension(
- @NotNull AutoExtension ax
+ @NotNull auto_extension_callback ax
);
public static native int sqlite3_changes(
Java's string type is compatible with that interface.
*/
public static native int sqlite3_collation_needed(
- @NotNull sqlite3 db, @Nullable CollationNeeded callback
+ @NotNull sqlite3 db, @Nullable collation_needed_callback callback
);
/**
@NotNull sqlite3_context cx
);
- public static native CommitHook sqlite3_commit_hook(
- @NotNull sqlite3 db, @Nullable CommitHook hook
+ public static native commit_hook_callback sqlite3_commit_hook(
+ @NotNull sqlite3 db, @Nullable commit_hook_callback hook
);
public static native String sqlite3_compileoption_get(
** If not built with SQLITE_ENABLE_SQLLOG defined, this returns
** SQLITE_MISUSE.
*/
- public static native int sqlite3_config( @Nullable SQLLog logger );
+ public static native int sqlite3_config( @Nullable config_sqllog_callback logger );
public static native int sqlite3_create_collation(
@NotNull sqlite3 db, @NotNull String name, int eTextRep,
- @NotNull Collation col
+ @NotNull collation_callback col
);
/**
acts as a proxy for C's sqlite3_preupdate_hook(), else it returns null
with no side effects.
*/
- public static native PreUpdateHook sqlite3_preupdate_hook(@NotNull sqlite3 db,
- @Nullable PreUpdateHook hook);
+ public static native preupdate_hook_callback sqlite3_preupdate_hook(
+ @NotNull sqlite3 db, @Nullable preupdate_hook_callback hook
+ );
/**
If the C API was built with SQLITE_ENABLE_PREUPDATE_HOOK defined,
}
public static native void sqlite3_progress_handler(
- @NotNull sqlite3 db, int n, @Nullable ProgressHandler h
+ @NotNull sqlite3 db, int n, @Nullable progress_handler_callback h
);
- //TODO??? void *sqlite3_preupdate_hook(...) and friends
-
public static native int sqlite3_reset(@NotNull sqlite3_stmt stmt);
/**
}
}
- public static native RollbackHook sqlite3_rollback_hook(
- @NotNull sqlite3 db, @Nullable RollbackHook hook
+ public static native rollback_hook_callback sqlite3_rollback_hook(
+ @NotNull sqlite3 db, @Nullable rollback_hook_callback hook
);
//! Sets or unsets (if auth is null) the current authorizer.
public static native int sqlite3_set_authorizer(
- @NotNull sqlite3 db, @Nullable Authorizer auth
+ @NotNull sqlite3 db, @Nullable authorizer_callback auth
);
public static native void sqlite3_set_last_insert_rowid(
cannot be processed propertly (i.e. an internal error).
*/
public static native int sqlite3_trace_v2(
- @NotNull sqlite3 db, int traceMask, @Nullable Tracer tracer
+ @NotNull sqlite3 db, int traceMask, @Nullable trace_v2_callback tracer
);
- public static native UpdateHook sqlite3_update_hook(
- sqlite3 db, UpdateHook hook
+ public static native update_hook_callback sqlite3_update_hook(
+ sqlite3 db, update_hook_callback hook
);
public static native byte[] sqlite3_value_blob(@NotNull sqlite3_value v);
final sqlite3 db = createNewDb();
execSql(db, "CREATE TABLE t(a); INSERT INTO t(a) VALUES('a'),('b'),('c')");
final ValueHolder<Boolean> xDestroyCalled = new ValueHolder<>(false);
- final Collation myCollation = new Collation() {
+ final collation_callback myCollation = new collation_callback() {
private String myState =
"this is local state. There is much like it, but this is mine.";
@Override
// Reverse-sorts its inputs...
- public int xCompare(byte[] lhs, byte[] rhs){
+ public int call(byte[] lhs, byte[] rhs){
int len = lhs.length > rhs.length ? rhs.length : lhs.length;
int c = 0, i = 0;
for(i = 0; i < len; ++i){
xDestroyCalled.value = true;
}
};
- final CollationNeeded collLoader = new CollationNeeded(){
- public int xCollationNeeded(sqlite3 dbArg, int eTextRep, String collationName){
+ final collation_needed_callback collLoader = new collation_needed_callback(){
+ @Override
+ public int call(sqlite3 dbArg, int eTextRep, String collationName){
affirm(dbArg == db/* as opposed to a temporary object*/);
return sqlite3_create_collation(dbArg, "reversi", eTextRep, myCollation);
}
from Java to sqlite3 and back to Java. (At no small efficiency
penalty.) */
final String nonBmpChar = "😃";
- sqlite3_trace_v2(
+ int rc = sqlite3_trace_v2(
db, SQLITE_TRACE_STMT | SQLITE_TRACE_PROFILE
| SQLITE_TRACE_ROW | SQLITE_TRACE_CLOSE,
- new Tracer(){
- public int xCallback(int traceFlag, Object pNative, Object x){
+ new trace_v2_callback(){
+ @Override public int call(int traceFlag, Object pNative, Object x){
++counter.value;
//outln("TRACE "+traceFlag+" pNative = "+pNative.getClass().getName());
switch(traceFlag){
return 0;
}
});
+ affirm( 0==rc );
execSql(db, "SELECT coalesce(null,null,'"+nonBmpChar+"'); "+
"SELECT 'w"+nonBmpChar+"orld'");
affirm( 6 == counter.value );
final ValueHolder<Boolean> xDestroyed = new ValueHolder<>(false);
final ValueHolder<Integer> xBusyCalled = new ValueHolder<>(0);
- BusyHandler handler = new BusyHandler(){
- @Override public int xCallback(int n){
+ busy_handler_callback handler = new busy_handler_callback(){
+ @Override public int call(int n){
//outln("busy handler #"+n);
return n > 2 ? 0 : ++xBusyCalled.value;
}
private void testProgress(){
final sqlite3 db = createNewDb();
final ValueHolder<Integer> counter = new ValueHolder<>(0);
- sqlite3_progress_handler(db, 1, new ProgressHandler(){
- public int xCallback(){
+ sqlite3_progress_handler(db, 1, new progress_handler_callback(){
+ @Override public int call(){
++counter.value;
return 0;
}
final sqlite3 db = createNewDb();
final ValueHolder<Integer> counter = new ValueHolder<>(0);
final ValueHolder<Integer> hookResult = new ValueHolder<>(0);
- final CommitHook theHook = new CommitHook(){
- public int xCommitHook(){
+ final commit_hook_callback theHook = new commit_hook_callback(){
+ @Override public int call(){
++counter.value;
return hookResult.value;
}
};
- CommitHook oldHook = sqlite3_commit_hook(db, theHook);
+ commit_hook_callback oldHook = sqlite3_commit_hook(db, theHook);
affirm( null == oldHook );
execSql(db, "CREATE TABLE t(a); INSERT INTO t(a) VALUES('a'),('b'),('c')");
affirm( 2 == counter.value );
execSql(db, "BEGIN; update t set a='g' where a='f'; COMMIT;");
affirm( 4 == counter.value );
- final CommitHook newHook = new CommitHook(){
- public int xCommitHook(){return 0;}
+ final commit_hook_callback newHook = new commit_hook_callback(){
+ @Override public int call(){return 0;}
};
oldHook = sqlite3_commit_hook(db, newHook);
affirm( null == oldHook );
final sqlite3 db = createNewDb();
final ValueHolder<Integer> counter = new ValueHolder<>(0);
final ValueHolder<Integer> expectedOp = new ValueHolder<>(0);
- final UpdateHook theHook = new UpdateHook(){
- @SuppressWarnings("unchecked")
+ final update_hook_callback theHook = new update_hook_callback(){
@Override
- public void xUpdateHook(int opId, String dbName, String tableName, long rowId){
+ public void call(int opId, String dbName, String tableName, long rowId){
++counter.value;
if( 0!=expectedOp.value ){
affirm( expectedOp.value == opId );
}
}
};
- UpdateHook oldHook = sqlite3_update_hook(db, theHook);
+ update_hook_callback oldHook = sqlite3_update_hook(db, theHook);
affirm( null == oldHook );
expectedOp.value = SQLITE_INSERT;
execSql(db, "CREATE TABLE t(a); INSERT INTO t(a) VALUES('a'),('b'),('c')");
oldHook = sqlite3_update_hook(db, null);
affirm( null == oldHook );
- final UpdateHook newHook = new UpdateHook(){
- public void xUpdateHook(int opId, String dbName, String tableName, long rowId){
+ final update_hook_callback newHook = new update_hook_callback(){
+ @Override public void call(int opId, String dbName, String tableName, long rowId){
}
};
oldHook = sqlite3_update_hook(db, newHook);
final sqlite3 db = createNewDb();
final ValueHolder<Integer> counter = new ValueHolder<>(0);
final ValueHolder<Integer> expectedOp = new ValueHolder<>(0);
- final PreUpdateHook theHook = new PreUpdateHook(){
- @SuppressWarnings("unchecked")
+ final preupdate_hook_callback theHook = new preupdate_hook_callback(){
@Override
- public void xPreUpdate(sqlite3 db, int opId, String dbName, String dbTable,
- long iKey1, long iKey2 ){
+ public void call(sqlite3 db, int opId, String dbName, String dbTable,
+ long iKey1, long iKey2 ){
++counter.value;
switch( opId ){
case SQLITE_UPDATE:
}
}
};
- PreUpdateHook oldHook = sqlite3_preupdate_hook(db, theHook);
+ preupdate_hook_callback oldHook = sqlite3_preupdate_hook(db, theHook);
affirm( null == oldHook );
expectedOp.value = SQLITE_INSERT;
execSql(db, "CREATE TABLE t(a); INSERT INTO t(a) VALUES('a'),('b'),('c')");
oldHook = sqlite3_preupdate_hook(db, null);
affirm( null == oldHook );
- final PreUpdateHook newHook = new PreUpdateHook(){
+ final preupdate_hook_callback newHook = new preupdate_hook_callback(){
@Override
- public void xPreUpdate(sqlite3 db, int opId, String dbName,
- String tableName, long iKey1, long iKey2){
+ public void call(sqlite3 db, int opId, String dbName,
+ String tableName, long iKey1, long iKey2){
}
};
oldHook = sqlite3_preupdate_hook(db, newHook);
private void testRollbackHook(){
final sqlite3 db = createNewDb();
final ValueHolder<Integer> counter = new ValueHolder<>(0);
- final RollbackHook theHook = new RollbackHook(){
- public void xRollbackHook(){
+ final rollback_hook_callback theHook = new rollback_hook_callback(){
+ @Override public void call(){
++counter.value;
}
};
- RollbackHook oldHook = sqlite3_rollback_hook(db, theHook);
+ rollback_hook_callback oldHook = sqlite3_rollback_hook(db, theHook);
affirm( null == oldHook );
execSql(db, "CREATE TABLE t(a); INSERT INTO t(a) VALUES('a'),('b'),('c')");
affirm( 0 == counter.value );
execSql(db, false, "BEGIN; SELECT 1; SELECT 2; ROLLBACK;");
affirm( 1 == counter.value /* contra to commit hook, is invoked if no changes are made */ );
- final RollbackHook newHook = new RollbackHook(){
- public void xRollbackHook(){return;}
+ final rollback_hook_callback newHook = new rollback_hook_callback(){
+ @Override public void call(){return;}
};
oldHook = sqlite3_rollback_hook(db, newHook);
affirm( theHook == oldHook );
final sqlite3 db = createNewDb();
final ValueHolder<Integer> counter = new ValueHolder<>(0);
final ValueHolder<Integer> authRc = new ValueHolder<>(0);
- final Authorizer auth = new Authorizer(){
- public int xAuth(int op, String s0, String s1, String s2, String s3){
+ final authorizer_callback auth = new authorizer_callback(){
+ public int call(int op, String s0, String s1, String s2, String s3){
++counter.value;
//outln("xAuth(): "+s0+" "+s1+" "+s2+" "+s3);
return authRc.value;
private synchronized void testAutoExtension(){
final ValueHolder<Integer> val = new ValueHolder<>(0);
final ValueHolder<String> toss = new ValueHolder<>(null);
- final AutoExtension ax = new AutoExtension(){
- public synchronized int xEntryPoint(sqlite3 db){
+ final auto_extension_callback ax = new auto_extension_callback(){
+ @Override public synchronized int call(sqlite3 db){
++val.value;
if( null!=toss.value ){
throw new RuntimeException(toss.value);
rc = sqlite3_auto_extension( ax );
affirm( 0==rc );
Exception err = null;
- toss.value = "Throwing from AutoExtension.";
+ toss.value = "Throwing from auto_extension.";
try{
sqlite3_close(createNewDb());
}catch(Exception e){
toss.value = null;
val.value = 0;
- final AutoExtension ax2 = new AutoExtension(){
- public synchronized int xEntryPoint(sqlite3 db){
+ final auto_extension_callback ax2 = new auto_extension_callback(){
+ @Override public synchronized int call(sqlite3 db){
++val.value;
return 0;
}
if( sqlLog ){
if( sqlite3_compileoption_used("ENABLE_SQLLOG") ){
- int rc = sqlite3_config( new SQLLog() {
- @Override public void xSqllog(sqlite3 db, String msg, int op){
+ int rc = sqlite3_config( new config_sqllog_callback() {
+ @Override public void call(sqlite3 db, String msg, int op){
switch(op){
case 0: outln("Opening db: ",db); break;
case 1: outln(db,": ",msg); break;
+++ /dev/null
-/*
-** 2023-07-22
-**
-** The author disclaims copyright to this source code. In place of
-** a legal notice, here is a blessing:
-**
-** May you do good and not evil.
-** May you find forgiveness for yourself and forgive others.
-** May you share freely, never taking more than you give.
-**
-*************************************************************************
-** This file is part of the JNI bindings for the sqlite3 C API.
-*/
-package org.sqlite.jni;
-
-/**
- Callback proxy for use with sqlite3_update_hook().
-*/
-public interface UpdateHook {
- /**
- Works as documented for the sqlite3_update_hook() callback.
- Must not throw.
- */
- void xUpdateHook(int opId, String dbName, String tableName, long rowId);
-}
/*
-** 2023-08-05
+** 2023-08-25
**
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
package org.sqlite.jni;
/**
- A callback for use with sqlite3_set_authorizer().
+ Callback for use with sqlite3_set_authorizer().
*/
-public interface Authorizer {
+public interface authorizer_callback extends sqlite3_callback_proxy {
/**
- Must function as described for the sqlite3_set_authorizer()
- callback.
+ Must function as described for the C-level
+ sqlite3_set_authorizer() callback.
Must not throw.
*/
- int xAuth(int opId, @Nullable String s1, @Nullable String s2,
- @Nullable String s3, @Nullable String s4);
+ int call(int opId, @Nullable String s1, @Nullable String s2,
+ @Nullable String s3, @Nullable String s4);
+
}
/*
-** 2023-08-05
+** 2023-08-25
**
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
A callback for use with the sqlite3_auto_extension() family of
APIs.
*/
-public interface AutoExtension {
+public interface auto_extension_callback extends sqlite3_callback_proxy {
/**
- Must function as described for a sqlite3_auto_extension()
- callback, with the caveat that the signature is shorter.
+ Must function as described for a C-level
+ sqlite3_auto_extension() callback, with the caveat that the
+ signature is shorter.
- AutoExtensions may throw and the exception's error message
- will be set as the db's error string.
+ This callback may throw and the exception's error message will
+ be set as the db's error string.
Tips for implementations:
- Opening a database from an auto-extension handler will lead to
- an endless recursion of the auto-handler triggering itself
- indirectly for each newly-opened database.
+ an endless recursion of the auto-handler triggering itself
+ indirectly for each newly-opened database.
- If this routine is stateful, it may be useful to make the
- overridden method synchronized.
+ overridden method synchronized.
- Results are undefined if db is closed by an auto-extension.
*/
- int xEntryPoint(sqlite3 db);
+ int call(sqlite3 db);
}
/*
-** 2023-07-22
+** 2023-08-25
**
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
*/
package org.sqlite.jni;
+
/**
- Callback proxy for use with sqlite3_busy_handler().
+ Callback for use with sqlite3_busy_handler()
*/
-public abstract class BusyHandler {
+public abstract class busy_handler_callback
+ implements sqlite3_callback_proxy, sqlite3_xDestroy_callback {
/**
- Must function as documented for the sqlite3_busy_handler()
- callback argument, minus the (void*) argument the C-level
- function requires.
+ Must function as documented for the C-level
+ sqlite3_busy_handler() callback argument, minus the (void*)
+ argument the C-level function requires.
Any exceptions thrown by this callback are suppressed in order to
retain the C-style API semantics of the JNI bindings.
*/
- public abstract int xCallback(int n);
+ public abstract int call(int n);
/**
Optionally override to perform any cleanup when this busy
handler is destroyed. It is destroyed when:
- The associated db is passed to sqlite3_close() or
- sqlite3_close_v2().
+ sqlite3_close_v2().
- sqlite3_busy_handler() is called to replace the handler,
- whether it's passed a null handler or any other instance of
- this class.
+ whether it's passed a null handler or any other instance of
+ this class.
- sqlite3_busy_timeout() is called, which implicitly installs
- a busy handler.
+ a busy handler.
*/
public void xDestroy(){}
}
/*
-** 2023-07-22
+** 2023-08-25
**
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
package org.sqlite.jni;
/**
+ Callback for use with sqlite3_create_collation()
*/
-public abstract class Collation {
+public abstract class collation_callback
+ implements sqlite3_callback_proxy, sqlite3_xDestroy_callback {
/**
Must compare the given byte arrays using memcmp() semantics.
*/
- public abstract int xCompare(byte[] lhs, byte[] rhs);
+ public abstract int call(byte[] lhs, byte[] rhs);
+
/**
- Called by SQLite when the collation is destroyed. If a Collation
+ Called by SQLite when the collation is destroyed. If a collation
requires custom cleanup, override this method.
*/
- public void xDestroy() {}
+ public void xDestroy(){}
}
/*
-** 2023-07-30
+** 2023-08-25
**
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
package org.sqlite.jni;
/**
- Callback proxy for use with sqlite3_collation_needed().
+ Callback for use with sqlite3_collation_needed().
*/
-public interface CollationNeeded {
+public interface collation_needed_callback extends sqlite3_callback_proxy {
/**
Has the same semantics as the C-level sqlite3_create_collation()
callback.
- If it throws, the exception message is passed on to the db and
+ <p>If it throws, the exception message is passed on to the db and
the exception is suppressed.
*/
- int xCollationNeeded(sqlite3 db, int eTextRep, String collationName);
+ int call(sqlite3 db, int eTextRep, String collationName);
}
/*
-** 2023-07-22
+** 2023-08-25
**
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
package org.sqlite.jni;
/**
- Callback proxy for use with sqlite3_commit_hook().
+ Callback for use with sqlite3_commit_hook()
*/
-public interface CommitHook {
+public interface commit_hook_callback extends sqlite3_callback_proxy {
/**
- Works as documented for the sqlite3_commit_hook() callback.
- Must not throw.
+ Works as documented for the C-level sqlite3_commit_hook()
+ callback. Must not throw.
*/
- int xCommitHook();
+ int call();
}
package org.sqlite.jni;
/**
- A callback for use with sqlite3_config(SQLLog).
+ A callback for use with sqlite3_config().
*/
-public interface SQLLog {
+public interface config_sqllog_callback {
/**
Must function as described for sqlite3_config(SQLITE_CONFIG_SQLLOG)
callback, with the slight signature change.
*/
- void xSqllog(sqlite3 db, String msg, int msgType );
+ void call(sqlite3 db, String msg, int msgType );
}
--- /dev/null
+/*
+** 2023-08-25
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file is part of the JNI bindings for the sqlite3 C API.
+*/
+package org.sqlite.jni;
+
+/**
+ Callback for use with sqlite3_preupdate_hook().
+*/
+public interface preupdate_hook_callback extends sqlite3_callback_proxy {
+ /**
+ Must function as described for the C-level sqlite3_preupdate_hook()
+ callback. Must not throw.
+ */
+ void call(sqlite3 db, int op, String dbName, String dbTable,
+ long iKey1, long iKey2 );
+}
/*
-** 2023-07-22
+** 2023-08-25
**
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
package org.sqlite.jni;
/**
- Callback proxy for use with sqlite3_progress_handler().
+ Callback for use with sqlite3_progress_handler()
*/
-public interface ProgressHandler {
+public interface progress_handler_callback extends sqlite3_callback_proxy {
/**
- Works as documented for the sqlite3_progress_handler() callback.
+ Works as documented for the C-level sqlite3_progress_handler() callback.
If it throws, the exception message is passed on to the db and
the exception is suppressed.
*/
- int xCallback();
+ int call();
}
/*
-** 2023-07-22
+** 2023-08-25
**
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
package org.sqlite.jni;
/**
- Callback proxy for use with sqlite3_rollback_hook().
+ Callback for use with sqlite3_rollback_hook()
*/
-public interface RollbackHook {
+public interface rollback_hook_callback extends sqlite3_callback_proxy {
/**
- Works as documented for the sqlite3_rollback_hook() callback.
- Must not throw.
+ Works as documented for the C-level sqlite3_rollback_hook()
+ callback. Must not throw.
*/
- void xRollbackHook();
+ void call();
}
--- /dev/null
+/*
+** 2023-08-25
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file is part of the JNI bindings for the sqlite3 C API.
+*/
+package org.sqlite.jni;
+/**
+ This marker interface exists soley for use as a documentation and
+ class-grouping tool. It should be applied to interfaces or
+ classes which have a call() method implementing some specific
+ callback interface on behalf of the C library.
+
+ <p>Callbacks of this style follow a common naming convention:
+
+ <p>1) They almost all have the same class or interface name as the
+ C function they are proxying a callback for, minus the sqlite3_
+ prefix, plus a _callback suffix. e.g. sqlite3_busy_handler()'s
+ callback is named busy_handler_callback. Exceptions are made where
+ that would potentially be ambiguous, e.g. config_sqllog_callback
+ instead of config_callback because the sqlite3_config() interface
+ may need to support more callback types in the future.
+
+ <p>2) They all have a call() method but its signature is
+ callback-specific.
+*/
+public interface sqlite3_callback_proxy {}
--- /dev/null
+/*
+** 2023-07-21
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file declares JNI bindings for the sqlite3 C API.
+*/
+package org.sqlite.jni;
+
+/**
+ Callback for a hook called by SQLite when certain client-provided
+ state are destroyed. It gets its name from the pervasive use of
+ the symbol name xDestroy() for this purpose in the C API
+ documentation.
+*/
+public interface sqlite3_xDestroy_callback {
+ /**
+ Must perform any cleanup required by this object. Must not
+ throw.
+ */
+ public void xDestroy();
+}
}
t.addTestScript(a);
}
- final AutoExtension ax = new AutoExtension() {
+ final auto_extension_callback ax = new auto_extension_callback() {
private final SQLTester tester = t;
- public int xEntryPoint(sqlite3 db){
+ @Override public int call(sqlite3 db){
final String init = tester.getDbInitSql();
if( !init.isEmpty() ){
tester.execSql(db, true, ResultBufferMode.NONE, null, init);
/*
-** 2023-07-22
+** 2023-08-25
**
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
/**
Callback proxy for use with sqlite3_trace_v2().
*/
-public interface Tracer {
+public interface trace_v2_callback extends sqlite3_callback_proxy {
/**
- Achtung: this interface is subject to change because the current
- approach to mapping the passed-in natives back to Java is
- uncomfortably quirky.
-
Called by sqlite3 for various tracing operations, as per
sqlite3_trace_v2(). Note that this interface elides the 2nd
argument to the native trace callback, as that role is better
filled by instance-local state.
- The 2nd argument to this function, if non-0, will be a native
+ <p>The 2nd argument to this function, if non-0, will be a native
pointer to either an sqlite3 or sqlite3_stmt object, depending on
the first argument (see below). Client code can pass it to the
sqlite3 resp. sqlite3_stmt constructor to create a wrapping
each call is comparatively expensive, and the objects are
probably only seldom useful.
- The final argument to this function is the "X" argument
+ <p>The final argument to this function is the "X" argument
documented for sqlite3_trace() and sqlite3_trace_v2(). Its type
depends on value of the first argument:
- - SQLITE_TRACE_STMT: pNative is a sqlite3_stmt. pX is a string
- containing the prepared SQL, with one caveat: JNI only provides
- us with the ability to convert that string to MUTF-8, as
- opposed to standard UTF-8, and is cannot be ruled out that that
- difference may be significant for certain inputs. The
- alternative would be that we first convert it to UTF-16 before
- passing it on, but there's no readily-available way to do that
- without calling back into the db to peform the conversion
- (which would lead to further tracing).
+ <p>- SQLITE_TRACE_STMT: pNative is a sqlite3_stmt. pX is a string
+ containing the prepared SQL, with one caveat: JNI only provides
+ us with the ability to convert that string to MUTF-8, as
+ opposed to standard UTF-8, and is cannot be ruled out that that
+ difference may be significant for certain inputs. The
+ alternative would be that we first convert it to UTF-16 before
+ passing it on, but there's no readily-available way to do that
+ without calling back into the db to peform the conversion
+ (which would lead to further tracing).
- - SQLITE_TRACE_PROFILE: pNative is a sqlite3_stmt. pX is a Long
- holding an approximate number of nanoseconds the statement took
- to run.
+ <p>- SQLITE_TRACE_PROFILE: pNative is a sqlite3_stmt. pX is a Long
+ holding an approximate number of nanoseconds the statement took
+ to run.
- - SQLITE_TRACE_ROW: pNative is a sqlite3_stmt. pX is null.
+ <p>- SQLITE_TRACE_ROW: pNative is a sqlite3_stmt. pX is null.
- - SQLITE_TRACE_CLOSE: pNative is a sqlite3. pX is null.
+ <p>- SQLITE_TRACE_CLOSE: pNative is a sqlite3. pX is null.
*/
- int xCallback(int traceFlag, Object pNative, Object pX);
+ int call(int traceFlag, Object pNative, Object pX);
}
--- /dev/null
+/*
+** 2023-08-25
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file is part of the JNI bindings for the sqlite3 C API.
+*/
+package org.sqlite.jni;
+
+/**
+ Callback for use with sqlite3_update_hook().
+*/
+public interface update_hook_callback extends sqlite3_callback_proxy {
+ /**
+ Must function as described for the C-level sqlite3_update_hook()
+ callback. Must not throw.
+ */
+ void call(int opId, String dbName, String tableName, long rowId);
+}
-C javadoc\sadditions.
-D 2023-08-25T00:27:28.089
+C Replace\sall\sof\sthe\sJNI\sXyzHook/Handler\sclasses\swith\ssnake_cased\sones\swhich\sfollow\sunified\snaming\sconventions\sto\smake\sthem\seasier\sto\sapply.
+D 2023-08-25T02:57:30.049
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
F ext/icu/README.txt 7ab7ced8ae78e3a645b57e78570ff589d4c672b71370f5aa9e1cd7024f400fc9
F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282
F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8
-F ext/jni/GNUmakefile 642624b421936807eeed2fe7d0f9df898837ad0e4be4d9e32af06b0e5ef2c5b6
-F ext/jni/README.md 9d3caa2e038bfe5e8356a9e8ff66f93ca0647ac278339eeea296f10017f5cf35
+F ext/jni/GNUmakefile fb73086e6f8ee40f3c79e32b8e0a27725b2680f9cf8ae41bde2556eb8e3fad2a
+F ext/jni/README.md 1332b1fa27918bd5d9ca2d0d4f3ac3a6ab86b9e3699dc5bfe32904a027f3d2a9
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
-F ext/jni/src/c/sqlite3-jni.c e4bdcd17e8f8e825f206e1c6ab5adf7f507d70b64b0f795c0cde141077fb68b2
-F ext/jni/src/c/sqlite3-jni.h 91c2eeee22d3594e6652d51edcce0cd94d258a768802fcfac13a78f900127b72
-F ext/jni/src/org/sqlite/jni/Authorizer.java e6cbc6605d4d254be892d5197dea6290180efb7c5dbb3060f8487563bb11bb65
-F ext/jni/src/org/sqlite/jni/AutoExtension.java bcc1849b2fccbe5e2d7ac9e9ac7f8d05a6d7088a8fedbaad90e39569745a61e6
-F ext/jni/src/org/sqlite/jni/BusyHandler.java 1b1d3e5c86cd796a0580c81b6af6550ad943baa25e47ada0dcca3aff3ebe978c
-F ext/jni/src/org/sqlite/jni/Collation.java 8dffbb00938007ad0967b2ab424d3c908413af1bbd3d212b9c9899910f1218d1
-F ext/jni/src/org/sqlite/jni/CollationNeeded.java ad67843b6dd1c06b6b0a1dc72887b7c48e2a98042fcf6cacf14d42444037eab8
-F ext/jni/src/org/sqlite/jni/CommitHook.java 87c6a8e5138c61a8eeff018fe16d23f29219150239746032687f245938baca1a
+F ext/jni/src/c/sqlite3-jni.c 2e9cabce55f0a4c0a56b29bbaa367c133959e94a390ec0129b4054832d0421f9
+F ext/jni/src/c/sqlite3-jni.h 3d8cdacce26d20fd967d67a2e8539d38fc2e9fe13598147399db4b2c303a89c8
F ext/jni/src/org/sqlite/jni/Fts5.java a45cd890202d72c3bfe8aea69b57b02b6dd588361af81d8b921954c37940b2f7
F ext/jni/src/org/sqlite/jni/Fts5Context.java 0a5a02047a6a1dd3e4a38b0e542a8dd2de365033ba30e6ae019a676305959890
F ext/jni/src/org/sqlite/jni/Fts5ExtensionApi.java 10cb2e0eb4dc5cf4241a7ccc0442a680f14a3ce6ecbb726552f2b5e026e521e0
F ext/jni/src/org/sqlite/jni/NotNull.java a4016df436f454e8d6786dd8421484edd6fc604043cf7fd8ec94cf922ba61604
F ext/jni/src/org/sqlite/jni/Nullable.java b2f8755970e9dd0e917a505638d036ccc699c8422f1a69fe9d98c0804beaea17
F ext/jni/src/org/sqlite/jni/OutputPointer.java 8d7b2c865217d3b7a47dccaddc4a24748463b770eecca90873402a38c0b2d819
-F ext/jni/src/org/sqlite/jni/PreUpdateHook.java dec00a706b58c67989f0ff56c4f0a703821d25b45c62dd7fed1b462049f15c26
-F ext/jni/src/org/sqlite/jni/ProgressHandler.java 6f62053a828a572de809828b1ee495380677e87daa29a1c57a0e2c06b0a131dc
F ext/jni/src/org/sqlite/jni/ResultCode.java ba701f20213a5f259e94cfbfdd36eb7ac7ce7797f2c6c7fca2004ff12ce20f86
-F ext/jni/src/org/sqlite/jni/RollbackHook.java b04c8abcc6ade44a8a57129e33765793f69df0ba909e49ba18d73f4268d92564
F ext/jni/src/org/sqlite/jni/SQLFunction.java 4d6291fa14fcca1a040609378f9f00a193145d79c3abbda98ba32c340904cbeb
-F ext/jni/src/org/sqlite/jni/SQLLog.java c60610b35208416940822e834d61f08fbbe5d6e06b374b541b49e41fd56c9798
-F ext/jni/src/org/sqlite/jni/SQLite3Jni.java af2d1a673f48bed8bb39ad9f7fe79c3d904cb2c6c875254a0e8c7e7db6539725
-F ext/jni/src/org/sqlite/jni/Tester1.java e9b82c561ec8771b3e4ea537ebd7c16dd096928b6b8221967a4726104c7c6cb2
+F ext/jni/src/org/sqlite/jni/SQLite3Jni.java cb848377b214562c968934dc1749c5493d42254cbc825e44e2d2c34085c2ec5e
+F ext/jni/src/org/sqlite/jni/Tester1.java 3bfbcbf0720f9b71e461eb016b8bc30289a7ceaab1aa5da13e319fd303bf19fd
F ext/jni/src/org/sqlite/jni/TesterFts5.java 6f135c60e24c89e8eecb9fe61dde0f3bb2906de668ca6c9186bcf34bdaf94629
-F ext/jni/src/org/sqlite/jni/Tracer.java a5cece9f947b0af27669b8baec300b6dd7ff859c3e6a6e4a1bd8b50f9714775d
-F ext/jni/src/org/sqlite/jni/UpdateHook.java e58645a1727f8a9bbe72dc072ec5b40d9f9362cb0aa24acfe93f49ff56a9016d
F ext/jni/src/org/sqlite/jni/ValueHolder.java f022873abaabf64f3dd71ab0d6037c6e71cece3b8819fa10bf26a5461dc973ee
+F ext/jni/src/org/sqlite/jni/authorizer_callback.java 1d2d7fd584f917afa507820644d95504bcc9c5d7363a7afeb58de3b256851bfe w ext/jni/src/org/sqlite/jni/Authorizer.java
+F ext/jni/src/org/sqlite/jni/auto_extension_callback.java c8754ffabe3b75bd8f209bf1451d6a180ec52e99b11c11b2e3642f1891eb2635 w ext/jni/src/org/sqlite/jni/AutoExtension.java
+F ext/jni/src/org/sqlite/jni/busy_handler_callback.java c9b046631646a9c123f26f7b0056f274d1e85c02475981603271f6feefa9bfee w ext/jni/src/org/sqlite/jni/BusyHandler.java
+F ext/jni/src/org/sqlite/jni/collation_callback.java 44ddecceafd1a099027a06bb53cbe825613255398990f58a57fcc9d9fb4c2ce2 w ext/jni/src/org/sqlite/jni/Collation.java
+F ext/jni/src/org/sqlite/jni/collation_needed_callback.java 0d5cbac245db9ff22b67c92c06f2e31ed557cd018f1c4670ae970e6f16f22cee w ext/jni/src/org/sqlite/jni/CollationNeeded.java
+F ext/jni/src/org/sqlite/jni/commit_hook_callback.java 88462783826026e61e522d9aae7a9b4cb0c30f7d56519e08a5de42213a0087bc w ext/jni/src/org/sqlite/jni/CommitHook.java
+F ext/jni/src/org/sqlite/jni/config_sqllog_callback.java d8b9b4e0f9a522fd40a88b4f9f87308fff1be255523ad6cff8493bf3bbca2ec8 w ext/jni/src/org/sqlite/jni/SQLLog.java
F ext/jni/src/org/sqlite/jni/fts5_api.java 5198be71c162e3e0cb1f4962a7cdf0d7596e8af53f70c4af6db24aab8d53d9ba
F ext/jni/src/org/sqlite/jni/fts5_extension_function.java ac825035d7d83fc7fd960347abfa6803e1614334a21533302041823ad5fc894c
F ext/jni/src/org/sqlite/jni/fts5_tokenizer.java e530b36e6437fcc500e95d5d75fbffe272bdea20d2fac6be2e1336c578fba98b
F ext/jni/src/org/sqlite/jni/package-info.java 5652d1bcaaf3ccb06d26c174e6d0b60571a545a0a3354dd8303960677be05e14
+F ext/jni/src/org/sqlite/jni/preupdate_hook_callback.java 2bcc61a9320a7af6be36e5a814d133dd610d8ead79622efd84e7444aabe25f6c w ext/jni/src/org/sqlite/jni/PreUpdateHook.java
+F ext/jni/src/org/sqlite/jni/progress_handler_callback.java eae32bd36639b12552becf82a0481bb4c09d22655920007b62e49130ce97a850 w ext/jni/src/org/sqlite/jni/ProgressHandler.java
+F ext/jni/src/org/sqlite/jni/rollback_hook_callback.java 25663dbad4f9da50019d0c68fc815d31155a04eaeb293f27fdc6f9b20a424760 w ext/jni/src/org/sqlite/jni/RollbackHook.java
F ext/jni/src/org/sqlite/jni/sqlite3.java 62b1b81935ccf3393472d17cb883dc5ff39c388ec3bc1de547f098a0217158fc
+F ext/jni/src/org/sqlite/jni/sqlite3_callback_proxy.java 4b3369faab47d787594c0544000dbac751d69641cac866f82f9be0e13c4b2ce5
F ext/jni/src/org/sqlite/jni/sqlite3_context.java dca23e54f368f8ea37c112c1d2f74dc9522d5da2fdf67d6fd6b2ec9603d8514c
F ext/jni/src/org/sqlite/jni/sqlite3_stmt.java 78e6d1b95ac600a9475e9db4623f69449322b0c93d1bd4e1616e76ed547ed9fc
F ext/jni/src/org/sqlite/jni/sqlite3_value.java 3d1d4903e267bc0bc81d57d21f5e85978eff389a1a6ed46726dbe75f85e6914a
-F ext/jni/src/org/sqlite/jni/tester/SQLTester.java bc3d6797a2f6cb7d443a0b72af84e5a45e0416b96af52e432d28e123db1970c3
+F ext/jni/src/org/sqlite/jni/sqlite3_xDestroy_callback.java 90470ef3e901e8f4863adacf361b0afcd5c7633166ed6c747630a30659224c20
+F ext/jni/src/org/sqlite/jni/tester/SQLTester.java e560303ada834363b615e5863050d1488bf5c83f0627b966fb1a0a6a4355029f
F ext/jni/src/org/sqlite/jni/tester/test-script-interpreter.md f9f25126127045d051e918fe59004a1485311c50a13edbf18c79a6ff9160030e
+F ext/jni/src/org/sqlite/jni/trace_v2_callback.java b3365dbfa1c9b0d18541ae530055a8ff55fc5b8494d30c03a12eafd9c8cb4e8c w ext/jni/src/org/sqlite/jni/Tracer.java
+F ext/jni/src/org/sqlite/jni/update_hook_callback.java 616dbc9f99bdfbde190af3d8a44a8ad418fdc5f8c63acb0a0d679bd063848da8 w ext/jni/src/org/sqlite/jni/UpdateHook.java
F ext/jni/src/tests/000-000-sanity.test cfe6dc1b950751d6096e3f5695becaadcdaa048bfe9567209d6eb676e693366d
F ext/jni/src/tests/000-001-ignored.test e17e874c6ab3c437f1293d88093cf06286083b65bf162317f91bbfd92f961b70
F ext/lsm1/Makefile a553b728bba6c11201b795188c5708915cc4290f02b7df6ba7e8c4c943fd5cd9
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 7232b033954fae40df3db43e489e0e5a703c03308f500a1ae36fd9d707632d7f
-R 2acb197dd02e88e8595f80978f7eae58
+P bedf33d403677d243a1505ce549166850ab55671700b143278db5feb84883ab3
+R 3d4d16fca03c716fac15f71f35ecf6fd
U stephan
-Z c7c0446afbe0f68b470086328d8c934a
+Z 276c090c642360abc3be58550d893d5e
# Remove this line to create a well-formed Fossil manifest.
-bedf33d403677d243a1505ce549166850ab55671700b143278db5feb84883ab3
\ No newline at end of file
+76e62a381249b3b4262b22bdffe7fc2816c820115c9df266956ab8817b127aca
\ No newline at end of file