]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
More work towards binding FTS5 customization to JNI. Add Fts*.java files missing...
authorstephan <stephan@noemail.net>
Fri, 4 Aug 2023 12:44:06 +0000 (12:44 +0000)
committerstephan <stephan@noemail.net>
Fri, 4 Aug 2023 12:44:06 +0000 (12:44 +0000)
FossilOrigin-Name: 91263178f463ca4623dd0203696eff6bcfd68abde5d2471be3f5a3edd791c52a

ext/jni/GNUmakefile
ext/jni/src/c/sqlite3-jni.c
ext/jni/src/c/sqlite3-jni.h
ext/jni/src/org/sqlite/jni/Fts5Context.java [new file with mode: 0644]
ext/jni/src/org/sqlite/jni/Fts5ExtensionApi.java [new file with mode: 0644]
ext/jni/src/org/sqlite/jni/Fts5Function.java [new file with mode: 0644]
ext/jni/src/org/sqlite/jni/SQLite3Jni.java
ext/jni/src/org/sqlite/jni/Tester1.java
ext/jni/src/org/sqlite/jni/fts5_api.java [new file with mode: 0644]
manifest
manifest.uuid

index e8cbd2fe01b587bdae98c5db898a4ac985eed0a9..3c6fe198e263923bde1af2ea58e986a4dcbe964e 100644 (file)
@@ -65,6 +65,7 @@ JAVA_FILES := $(patsubst %,$(dir.src.jni)/%,\
 )
 ifeq (1,$(enable.fts5))
   JAVA_FILES += $(patsubst %,$(dir.src.jni)/%,\
+    fts5_api.java \
     Fts5Context.java \
     Fts5ExtensionApi.java \
     Fts5Function.java \
@@ -147,6 +148,9 @@ endif
 sqlite3-jni.c := $(dir.src.c)/sqlite3-jni.c
 sqlite3-jni.o := $(dir.bld.c)/sqlite3-jni.o
 sqlite3-jni.h.in := $(dir.bld.c)/org_sqlite_jni_SQLite3Jni.h
+ifeq (1,$(enable.fts5))
+  sqlite3-jni.h.in += $(dir.bld.c)/org_sqlite_jni_Fts5ExtensionApi.h
+endif
 sqlite3-jni.h   := $(dir.src.c)/sqlite3-jni.h
 sqlite3-jni.dll := $(dir.bld.c)/libsqlite3-jni.so
 # ------------------------------^^^ lib prefix is requires
index 0bd38161ebf538defed6eb2ba5f7674ff0907796..6bb2c8d9f299f4ba4bd16e61d42b19463a232009 100644 (file)
 #define PtrGet_sqlite3_stmt(OBJ) getNativePointer(env,OBJ,S3ClassNames.sqlite3_stmt)
 #define PtrGet_sqlite3_value(OBJ) getNativePointer(env,OBJ,S3ClassNames.sqlite3_value)
 #define PtrGet_sqlite3_context(OBJ) getNativePointer(env,OBJ,S3ClassNames.sqlite3_context)
-#ifdef SQLITE_ENABLE_FTS5
-#define PtrGet_Fts5Context(OBJ) getNativePointer(env,OBJ,S3ClassNames.Fts5Context)
-#endif
 /* Helpers for Java value reference management. */
 #define REF_G(VAR) (*env)->NewGlobalRef(env, VAR)
 #define REF_L(VAR) (*env)->NewLocalRef(env, VAR)
@@ -205,6 +202,7 @@ static const struct {
   const char * const sqlite3_context;
   const char * const sqlite3_value;
   const char * const OutputPointer_Int32;
+  const char * const OutputPointer_Int64;
 #ifdef SQLITE_ENABLE_FTS5
   const char * const Fts5Context;
   const char * const Fts5ExtensionApi;
@@ -215,9 +213,11 @@ static const struct {
   "org/sqlite/jni/sqlite3_context",
   "org/sqlite/jni/sqlite3_value",
   "org/sqlite/jni/OutputPointer$Int32",
+  "org/sqlite/jni/OutputPointer$Int64",
 #ifdef SQLITE_ENABLE_FTS5
   "org/sqlite/jni/Fts5Context",
   "org/sqlite/jni/Fts5ExtensionApi"
+  "org/sqlite/jni/fts5_api"
 #endif
 };
 
@@ -335,13 +335,12 @@ struct JNIEnvCacheLine {
                             sqlite3_stmt wrapper object for every
                             tracing call which needs a stmt
                             object. This approach is rather invasive,
-                            however, and there may well be places
-                            tracing may trigger which we have no
-                            accounted for, so it may be best to
-                            redefine the tracing API rather than
-                            passing through the statement handles. */;
+                            however, requiring code in all stmt
+                            operations which can lead through the
+                            tracing API. */;
 #ifdef SQLITE_ENABLE_FTS5
-  jobject jFts5Ext       /* Java singleton for the Fts5ExtensionApi instance. */;
+  jobject jFtsExt       /* Global ref to Java singleton for the
+                           Fts5ExtensionApi instance. */;
 #endif
 #if 0
   /* TODO: refactor this cache as a linked list with malloc()'d entries,
@@ -368,6 +367,9 @@ static void JNIEnvCacheLine_clear(JNIEnvCacheLine * const p){
   if(env){
     UNREF_G(p->globalClassObj);
     UNREF_G(p->globalClassLong);
+#ifdef SQLITE_ENABLE_FTS5
+    UNREF_G(p->jFtsExt);
+#endif
     i = 0;
     for( ; i < NphCache_SIZE; ++i){
       NphCacheLine_clear(env, &p->nph[i]);
@@ -412,8 +414,9 @@ struct PerDbStateJni {
                    it would be a different instance (and maybe even a
                    different class) than the one the user may expect
                    to receive. */;
-  PerDbStateJni * pNext /* Next entry in the available/free list */;
-  PerDbStateJni * pPrev /* Previous entry in the available/free list */;
+#ifdef SQLITE_ENABLE_FTS5
+  jobject jFtsApi /* global ref to fts5_api object for the db. */;
+#endif
   JniHookState busyHandler;
   JniHookState collation;
   JniHookState collationNeeded;
@@ -422,6 +425,8 @@ struct PerDbStateJni {
   JniHookState rollbackHook;
   JniHookState trace;
   JniHookState updateHook;
+  PerDbStateJni * pNext /* Next entry in the available/free list */;
+  PerDbStateJni * pPrev /* Previous entry in the available/free list */;
 };
 
 static struct {
@@ -795,6 +800,9 @@ static void PerDbStateJni_set_aside(PerDbStateJni * const s){
     UNHOOK(busyHandler, 1);
 #undef UNHOOK
     UNREF_G(s->jDb);
+#ifdef SQLITE_ENABLE_FTS5
+    UNREF_G(s->jFtsApi);
+#endif
     memset(s, 0, sizeof(PerDbStateJni));
     s->pNext = S3Global.perDb.aFree;
     if(s->pNext) s->pNext->pPrev = s;
@@ -951,6 +959,25 @@ static void setOutputInt32(JNIEnv * env, jobject jOut, int v){
   EXCEPTION_IS_FATAL("Cannot set OutputPointer.Int32.value");
 }
 
+/* Sets a native int64 value in OutputPointer.Int64 object jOut. */
+static void setOutputInt64(JNIEnv * env, jobject jOut, jlong v){
+  jfieldID setter = 0;
+  struct NphCacheLine * const cacheLine =
+    S3Global_nph_cache(env, S3ClassNames.OutputPointer_Int64);
+  if(cacheLine && cacheLine->klazz && cacheLine->fidValue){
+    setter = cacheLine->fidValue;
+  }else{
+    const jclass klazz = (*env)->GetObjectClass(env, jOut);
+    setter = (*env)->GetFieldID(env, klazz, "value", "I");
+    if(cacheLine){
+      assert(!cacheLine->fidValue);
+      cacheLine->fidValue = setter;
+    }
+  }
+  (*env)->SetIntField(env, jOut, setter, (jint)v);
+  EXCEPTION_IS_FATAL("Cannot set OutputPointer.Int64.value");
+}
+
 static int encodingTypeIsValid(int eTextRep){
   switch(eTextRep){
     case SQLITE_UTF8: case SQLITE_UTF16:
@@ -1114,26 +1141,6 @@ static jobject new_sqlite3_stmt_wrapper(JNIEnv * const env, sqlite3_stmt *sv){
   return new_NativePointerHolder_object(env, S3ClassNames.sqlite3_stmt, sv);
 }
 
-#if 0
-#ifdef SQLITE_ENABLE_FTS5
-static jobject new_Fts5Context_wrapper(JNIEnv * const env, Fts5Context *sv){
-  return new_NativePointerHolder_object(env, S3ClassNames.Fts5Context, sv);
-}
-#endif
-#endif
-
-#ifdef SQLITE_ENABLE_FTS5
-/*static*/ jobject s3jni_getFts5ExensionApi(JNIEnv * const env){
-  JNIEnvCacheLine * const row = S3Global_env_cache(env);
-  if( !row->jFts5Ext ){
-    row->jFts5Ext = new_NativePointerHolder_object(env, S3ClassNames.Fts5ExtensionApi,
-                                                   &sFts5Api/*from sqlite3.c*/);
-    if(row->jFts5Ext) row->jFts5Ext = REF_G(row->jFts5Ext);
-  }
-  return row->jFts5Ext;
-}
-#endif
-
 enum UDFType {
   UDF_SCALAR = 1,
   UDF_AGGREGATE,
@@ -2582,11 +2589,83 @@ JDECL(void,1do_1something_1for_1developer)(JENV_JSELF){
 #undef SO
 }
 
+////////////////////////////////////////////////////////////////////////
+// End of the sqlite3_... API bindings. Next up, FTS5...
+////////////////////////////////////////////////////////////////////////
+#ifdef SQLITE_ENABLE_FTS5
+
+/* Creates a verbose JNI Fts5 function name. */
+#define JFuncNameFts5Ext(Suffix)                  \
+  Java_org_sqlite_jni_Fts5ExtensionApi_ ## Suffix
+
+#define JDECLFts(ReturnType,Suffix)             \
+  JNIEXPORT ReturnType JNICALL                  \
+  JFuncNameFts5Ext(Suffix)
+
+#define PtrGet_Fts5Context(OBJ) getNativePointer(env,OBJ,S3ClassNames.Fts5Context)
+static inline Fts5ExtensionApi const * s3jni_ftsext(void){
+  return &sFts5Api/*singleton from sqlite3.c*/;
+}
+#define Fts5ExtDecl Fts5ExtensionApi const * const fext = s3jni_ftsext()
+
+#if 0
+static jobject new_Fts5Context_wrapper(JNIEnv * const env, Fts5Context *sv){
+  return new_NativePointerHolder_object(env, S3ClassNames.Fts5Context, sv);
+}
+#endif
+
+static jobject s3jni_getFts5ExensionApi(JNIEnv * const env){
+  JNIEnvCacheLine * const row = S3Global_env_cache(env);
+  if( !row->jFtsExt ){
+    row->jFtsExt = new_NativePointerHolder_object(env, S3ClassNames.Fts5ExtensionApi,
+                                                   s3jni_ftsext());
+    if(row->jFtsExt) row->jFtsExt = REF_G(row->jFtsExt);
+  }
+  return row->jFtsExt;
+}
+
+JDECLFts(jobject,getInstance)(JENV_JSELF){
+  return s3jni_getFts5ExensionApi(env);
+}
+
+JDECLFts(jint,xColumnCount)(JENV_JSELF,jobject jCtx){
+  Fts5ExtDecl;
+  return (jint)fext->xColumnCount(PtrGet_Fts5Context(jCtx));
+}
+
+JDECLFts(jint,xColumnTotalSize)(JENV_JSELF,jobject jCtx, jint iCol, jobject jOut64){
+  Fts5ExtDecl;
+  sqlite3_int64 nOut = 0;
+  int const rc = fext->xColumnTotalSize(PtrGet_Fts5Context(jCtx), (int)iCol, &nOut);
+  if( 0==rc && jOut64 ) setOutputInt64(env, jOut64, (jlong)nOut);
+  return (jint)rc;
+}
 
+JDECLFts(jint,xPhraseCount)(JENV_JSELF,jobject jCtx){
+  Fts5ExtDecl;
+  return (jint)fext->xPhraseCount(PtrGet_Fts5Context(jCtx));
+}
+
+JDECLFts(jint,xPhraseSize)(JENV_JSELF,jobject jCtx, jint iPhrase){
+  Fts5ExtDecl;
+  return (jint)fext->xPhraseSize(PtrGet_Fts5Context(jCtx), (int)iPhrase);
+}
+
+JDECLFts(jint,xRowCount)(JENV_JSELF,jobject jCtx, jobject jOut64){
+  Fts5ExtDecl;
+  sqlite3_int64 nOut = 0;
+  int const rc = fext->xRowCount(PtrGet_Fts5Context(jCtx), &nOut);
+  if( 0==rc && jOut64 ) setOutputInt64(env, jOut64, (jlong)nOut);
+  return (jint)rc;
+}
+
+
+#endif /* SQLITE_ENABLE_FTS5 */
 ////////////////////////////////////////////////////////////////////////
 // End of the main API bindings. What follows are internal utilities.
 ////////////////////////////////////////////////////////////////////////
 
+
 /**
    Called during static init of the SQLite3Jni class to sync certain
    compile-time constants to Java-space.
index ee34f79fa3607e8521caa4861fa2273f93083947..aa2786f0c63d97be85749ef57a8fab7b0432812f 100644 (file)
@@ -1615,3 +1615,64 @@ JNIEXPORT void JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1do_1something_1fo
 }
 #endif
 #endif
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class org_sqlite_jni_Fts5ExtensionApi */
+
+#ifndef _Included_org_sqlite_jni_Fts5ExtensionApi
+#define _Included_org_sqlite_jni_Fts5ExtensionApi
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     org_sqlite_jni_Fts5ExtensionApi
+ * Method:    getInstance
+ * Signature: ()Lorg/sqlite/jni/Fts5ExtensionApi;
+ */
+JNIEXPORT jobject JNICALL Java_org_sqlite_jni_Fts5ExtensionApi_getInstance
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     org_sqlite_jni_Fts5ExtensionApi
+ * Method:    xColumnCount
+ * Signature: (Lorg/sqlite/jni/Fts5Context;)I
+ */
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_Fts5ExtensionApi_xColumnCount
+  (JNIEnv *, jobject, jobject);
+
+/*
+ * Class:     org_sqlite_jni_Fts5ExtensionApi
+ * Method:    xRowCount
+ * Signature: (Lorg/sqlite/jni/Fts5Context;Lorg/sqlite/jni/OutputPointer/Int64;)I
+ */
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_Fts5ExtensionApi_xRowCount
+  (JNIEnv *, jobject, jobject, jobject);
+
+/*
+ * Class:     org_sqlite_jni_Fts5ExtensionApi
+ * Method:    xColumnTotalSize
+ * Signature: (Lorg/sqlite/jni/Fts5Context;ILorg/sqlite/jni/OutputPointer/Int64;)I
+ */
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_Fts5ExtensionApi_xColumnTotalSize
+  (JNIEnv *, jobject, jobject, jint, jobject);
+
+/*
+ * Class:     org_sqlite_jni_Fts5ExtensionApi
+ * Method:    xPhraseCount
+ * Signature: (Lorg/sqlite/jni/Fts5Context;)I
+ */
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_Fts5ExtensionApi_xPhraseCount
+  (JNIEnv *, jobject, jobject);
+
+/*
+ * Class:     org_sqlite_jni_Fts5ExtensionApi
+ * Method:    xPhraseSize
+ * Signature: (Lorg/sqlite/jni/Fts5Context;I)I
+ */
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_Fts5ExtensionApi_xPhraseSize
+  (JNIEnv *, jobject, jobject, jint);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/ext/jni/src/org/sqlite/jni/Fts5Context.java b/ext/jni/src/org/sqlite/jni/Fts5Context.java
new file mode 100644 (file)
index 0000000..e78f67d
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+** 2023-08-04
+**
+** 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 wrapper for communicating C-level (Fts5Context*) instances with
+   Java. These wrappers do not own their associated pointer, they
+   simply provide a type-safe way to communicate it between Java and C
+   via JNI.
+*/
+public final class Fts5Context extends NativePointerHolder<Fts5Context> {
+}
diff --git a/ext/jni/src/org/sqlite/jni/Fts5ExtensionApi.java b/ext/jni/src/org/sqlite/jni/Fts5ExtensionApi.java
new file mode 100644 (file)
index 0000000..d2a75e0
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+** 2023-08-04
+**
+** 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;
+
+/**
+   FAR FROM COMPLETE and the feasibility of binding this to Java
+   is still undetermined. This might be removed.
+
+   Reminder to self: the native Fts5ExtensionApi is a singleton.
+*/
+public final class Fts5ExtensionApi extends NativePointerHolder<Fts5ExtensionApi> {
+  //! Only called from JNI
+  private Fts5ExtensionApi(){}
+  private int iVersion;
+
+  public static native Fts5ExtensionApi getInstance();
+
+  public native int xColumnCount(Fts5Context fcx);
+  public native int xRowCount(Fts5Context fcx, OutputPointer.Int64 nRow);
+  public native int xColumnTotalSize(Fts5Context fcx, int iCol, OutputPointer.Int64 pnToken);
+  public native int xPhraseCount(Fts5Context fcx);
+  public native int xPhraseSize(Fts5Context fcx, int iPhrase);
+  /**************************************************************
+  void *(*xUserData)(Fts5Context*);
+
+  int (*xTokenize)(Fts5Context*,
+    const char *pText, int nText,
+    void *pCtx,
+    int (*xToken)(void*, int, const char*, int, int, int)
+  );
+
+  int (*xPhraseCount)(Fts5Context*);
+  int (*xPhraseSize)(Fts5Context*, int iPhrase);
+
+  int (*xInstCount)(Fts5Context*, int *pnInst);
+  int (*xInst)(Fts5Context*, int iIdx, int *piPhrase, int *piCol, int *piOff);
+
+  sqlite3_int64 (*xRowid)(Fts5Context*);
+  int (*xColumnText)(Fts5Context*, int iCol, const char **pz, int *pn);
+  int (*xColumnSize)(Fts5Context*, int iCol, int *pnToken);
+
+  int (*xQueryPhrase)(Fts5Context*, int iPhrase, void *pUserData,
+    int(*)(const Fts5ExtensionApi*,Fts5Context*,void*)
+  );
+  int (*xSetAuxdata)(Fts5Context*, void *pAux, void(*xDelete)(void*));
+  void *(*xGetAuxdata)(Fts5Context*, int bClear);
+
+  int (*xPhraseFirst)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*, int*);
+  void (*xPhraseNext)(Fts5Context*, Fts5PhraseIter*, int *piCol, int *piOff);
+
+  int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*);
+  void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol);
+  **************************************************************/
+}
diff --git a/ext/jni/src/org/sqlite/jni/Fts5Function.java b/ext/jni/src/org/sqlite/jni/Fts5Function.java
new file mode 100644 (file)
index 0000000..463ec03
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+** 2023-08-04
+**
+** 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;
+
+/**
+   Fts5Function is used in conjunction with the
+   sqlite3_create_fts_function() JNI-bound API to give that native code
+   access to the callback functions needed in order to implement
+   FTS5 auxiliary functions in Java.
+*/
+public abstract class Fts5Function {
+
+  public abstract void xFunction(Fts5ExtensionApi pApi, Fts5Context pFts,
+                                 sqlite3_context pCtx, sqlite3_value argv[]);
+  public void xDestroy() {}
+}
index a2d0b88223f4c8697d82c4222a41e6faced07d1c..03401dab755ec5d4bcb59725d710b169c2fae9b9 100644 (file)
@@ -776,14 +776,6 @@ public final class SQLite3Jni {
 
   public static native byte[] sqlite3_value_text16be(@NotNull sqlite3_value v);
 
-  //TODO: to_java() should return a closest-match type for the given
-  //value. The quirk is that it would need to return object-type values,
-  //e.g. Integer instead of int, and creating those is a bit of a nuisance
-  //from JNI.
-  //public static native Object sqlite3_value_to_java(@NotNull sqlite3_value v);
-  // Or we can just implement it in Java:
-  //public static Object sqlite3_value_to_java(@NotNull sqlite3_value v){...}
-
   public static native int sqlite3_value_type(@NotNull sqlite3_value v);
 
   public static native int sqlite3_value_numeric_type(@NotNull sqlite3_value v);
index 69bf30756f257577c04c887f3fd48367c0082c99..5a318e7257677c0fe9d6fe5a81fdfce42147d2ff 100644 (file)
@@ -877,7 +877,6 @@ public class Tester1 {
     sqlite3_close_v2(db);
   }
 
-
   private static void testRollbackHook(){
     final sqlite3 db = createNewDb();
     final ValueHolder<Integer> counter = new ValueHolder<>(0);
@@ -910,6 +909,12 @@ public class Tester1 {
     sqlite3_close_v2(db);
   }
 
+  private static void testFts1(){
+    Fts5ExtensionApi fea = Fts5ExtensionApi.getInstance();
+    affirm( null != fea );
+    affirm( fea.getNativePointer() != 0 );
+  }
+
   private static void testSleep(){
     out("Sleeping briefly... ");
     sqlite3_sleep(600);
diff --git a/ext/jni/src/org/sqlite/jni/fts5_api.java b/ext/jni/src/org/sqlite/jni/fts5_api.java
new file mode 100644 (file)
index 0000000..3210493
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+** 2023-08-04
+**
+** 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 wrapper for communicating C-level (fts5_api*) instances with
+   Java. These wrappers do not own their associated pointer, they
+   simply provide a type-safe way to communicate it between Java and C
+   via JNI.
+*/
+public final class fts5_api extends NativePointerHolder<fts5_api> {
+}
index 7bb35487bf9ad0d9067e880a06622e90dc1d7318..7bc8ad8f1c94d5a987d3e57d97ffc7beeda2e689 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Start\sincluding\sfts5\scustomization\sbits\sinto\sJNI,\sbut\sit's\sfar\sfrom\sfunctional.
-D 2023-08-04T11:08:25.675
+C More\swork\stowards\sbinding\sFTS5\scustomization\sto\sJNI.\sAdd\sFts*.java\sfiles\smissing\sfrom\sprevious\scheckin.
+D 2023-08-04T12:44:06.920
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -230,24 +230,28 @@ F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c
 F ext/icu/README.txt 7ab7ced8ae78e3a645b57e78570ff589d4c672b71370f5aa9e1cd7024f400fc9
 F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282
 F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8
-F ext/jni/GNUmakefile 4497a2f82b5d95cb409d9207f7d82c54f100eeb0cc2b05aa05e806566b6a38a1
+F ext/jni/GNUmakefile ff5c539c686b79598c9703822343a3b3117b2153ccebde0935f805f760de0847
 F ext/jni/README.md 6ff7e1f4100dee980434a6ee37a199b653bceec62e233a6e2ccde6e7ae0c58bf
-F ext/jni/src/c/sqlite3-jni.c 904404bc810a809c2ec7de9fc178d559ceb8c4310fec82629ac25107de3f0e28
-F ext/jni/src/c/sqlite3-jni.h 74aaf87e77f99857aa3afc013517c934cbc2c16618c83d8f5d6294351bc8e7b1
+F ext/jni/src/c/sqlite3-jni.c 8ec2c1cc63af05bc84965c73e0dacb39474f5efd9fa712c780a24a44237c5e4b
+F ext/jni/src/c/sqlite3-jni.h ed03612024e9fe06a9e0655ccfe9f9f7bd899c7e68badad636c7d9833682655b
 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 ebc7cd96d46a70daa76016a308e80f70a3f21d3282787c8d139aa840fdcb1bd7
 F ext/jni/src/org/sqlite/jni/CommitHook.java 87c6a8e5138c61a8eeff018fe16d23f29219150239746032687f245938baca1a
+F ext/jni/src/org/sqlite/jni/Fts5Context.java 0a5a02047a6a1dd3e4a38b0e542a8dd2de365033ba30e6ae019a676305959890
+F ext/jni/src/org/sqlite/jni/Fts5ExtensionApi.java a1352e38eda4f0a78c51d4e1d71bacc7aa9bd9a47f4724626399079992ffdb1f
+F ext/jni/src/org/sqlite/jni/Fts5Function.java 65cde7151e441fee012250a5e03277de7babcd11a0c308a832b7940574259bcc
 F ext/jni/src/org/sqlite/jni/NativePointerHolder.java 9c5d901cce4f7e57c3d623f4e2476f9f79a8eed6e51b2a603f37866018e040ee
 F ext/jni/src/org/sqlite/jni/OutputPointer.java c7868f1f4ad63435ee44d409377df7dd7e02592a3734df8887a22a9f74b12751
 F ext/jni/src/org/sqlite/jni/ProgressHandler.java 5979450e996416d28543f1d42634d308439565a99332a8bd84e424af667116cc
 F ext/jni/src/org/sqlite/jni/RollbackHook.java b04c8abcc6ade44a8a57129e33765793f69df0ba909e49ba18d73f4268d92564
 F ext/jni/src/org/sqlite/jni/SQLFunction.java 09ce81c1c637e31c3a830d4c859cce95d65f5e02ff45f8bd1985b3479381bc46
-F ext/jni/src/org/sqlite/jni/SQLite3Jni.java 78c079efc177d2975932fca9cfd34dd4d2c2062feae3f6f2016d0964e5a7120c
-F ext/jni/src/org/sqlite/jni/Tester1.java 9443cdbd2b10f6a8e1f3abd1694983a16b17960f8ed2f7e06bcc7e535fb5abcf
+F ext/jni/src/org/sqlite/jni/SQLite3Jni.java 78496a02c7cc65a2238f54e935af070acf4e2dbef95d7cc1ff46938c440848a4
+F ext/jni/src/org/sqlite/jni/Tester1.java fed44197213929cb16edbb59d68f057d0b851cb35c4b52366b021e158ded304b
 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/fts5_api.java 916fc40f96f1a9cb288d2d9656d88db69a684ae922c38fdf3dd947b1878bb357
 F ext/jni/src/org/sqlite/jni/sqlite3.java 600c3ddc1ac28ee8f58669fb435fd0d21f2972c652039361fde907d4fe44eb58
 F ext/jni/src/org/sqlite/jni/sqlite3_context.java d26573fc7b309228cb49786e9078597d96232257defa955a3425d10897bca810
 F ext/jni/src/org/sqlite/jni/sqlite3_stmt.java 72a0698aeb50a183ad146cd29ee04952abb8c36021f6122656aa5ec20469f6f7
@@ -2071,8 +2075,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 2c88390faa108a60c8fb1eb7aad05d90f3daf4cfef14ca73987597aaf7be83c9
-R 8bcf0b9bad61c244dfd6aa8e17b480b1
+P abaf5edd0430e3301a11bd0acb9ce4b81b310237e1799701411db56ef7605e01
+R 0ce682e16f3279fc573892c09d1e8907
 U stephan
-Z a12eb6e80e9b1d3771520cdb25f8972d
+Z cb3ae8248e37b24a50f177e201f5ab44
 # Remove this line to create a well-formed Fossil manifest.
index 2662a57a0f4f6a333293932fcbf81c774678a0ba..9493d6175f65045d60d3bfaf675fcba3bd1b3aaf 100644 (file)
@@ -1 +1 @@
-abaf5edd0430e3301a11bd0acb9ce4b81b310237e1799701411db56ef7605e01
\ No newline at end of file
+91263178f463ca4623dd0203696eff6bcfd68abde5d2471be3f5a3edd791c52a
\ No newline at end of file