From: stephan Date: Sat, 5 Aug 2023 11:16:54 +0000 (+0000) Subject: Bind Fts5ExtensionApi::xUserData() to JNI and extend xCreateFunction() to accept... X-Git-Tag: version-3.43.0~47^2~98 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=695d0b698a61620be5e92405e57091617a549fa2;p=thirdparty%2Fsqlite.git Bind Fts5ExtensionApi::xUserData() to JNI and extend xCreateFunction() to accept that argument. In test code, use assert() instead of exceptions if assert() is enabled so that test failures (exceptions) thrown via callbacks do not get suppressed (which they otherwise necessarily are to avoid crashing the host app). FossilOrigin-Name: e43837377696e468cd31cf71585fe235ffe67a9f4d3b036c5f9d0cb7141d0f57 --- diff --git a/ext/jni/src/c/sqlite3-jni.c b/ext/jni/src/c/sqlite3-jni.c index c2397921b2..9e65baafb2 100644 --- a/ext/jni/src/c/sqlite3-jni.c +++ b/ext/jni/src/c/sqlite3-jni.c @@ -2677,6 +2677,11 @@ typedef struct { JNIEnv * env; /* env registered from */; jobject jObj /* functor instance */; jclass klazz /* jObj's class */; + jobject jUserData /* 2nd arg to JNI binding of + xCreateFunction(), ostensibly the 3rd arg + to the lib-level xCreateFunction(), except + that we necessarily use that slot for a + Fts5JniAux instance. */; char * zFuncName /* Only for error reporting and debug logging */; jmethodID jmid /* callback member's method ID */; } Fts5JniAux; @@ -2688,6 +2693,7 @@ static void Fts5JniAux_free(Fts5JniAux * const s){ s3jni_call_xDestroy(env, s->jObj, s->klazz); UNREF_G(s->jObj); UNREF_G(s->klazz); + UNREF_G(s->jUserData); } sqlite3_free(s->zFuncName); sqlite3_free(s); @@ -2879,7 +2885,8 @@ error_oom: return; } -JDECLFtsApi(jint,xCreateFunction)(JENV_JSELF, jstring jName, jobject jFunc){ +JDECLFtsApi(jint,xCreateFunction)(JENV_JSELF, jstring jName, + jobject jUserData, jobject jFunc){ fts5_api * const pApi = PtrGet_fts5_api(jSelf); int rc; char const * zName; @@ -2896,8 +2903,9 @@ JDECLFtsApi(jint,xCreateFunction)(JENV_JSELF, jstring jName, jobject jFunc){ rc = SQLITE_NOMEM; } if( 0==rc ){ - pAux->zFuncName = sqlite3_mprintf("%s", zName); - /* OOM here is non-fatal. Ignore it. */ + pAux->jUserData = jUserData ? REF_G(jUserData) : 0; + pAux->zFuncName = sqlite3_mprintf("%s", zName) + /* OOM here is non-fatal. Ignore it. */; } JSTR_RELEASE(jName, zName); return (jint)rc; @@ -3261,6 +3269,13 @@ JDECLFtsTok(jint,xTokenize)(JENV_JSELF,jobject jFcx, jint tokFlags, } +JDECLFtsXA(jobject,xUserData)(JENV_JSELF,jobject jFcx){ + Fts5ExtDecl; + Fts5JniAux * const pAux = fext->xUserData(PtrGet_Fts5Context(jFcx)); + return pAux ? pAux->jUserData : 0; +} + + #endif /* SQLITE_ENABLE_FTS5 */ //////////////////////////////////////////////////////////////////////// // End of the main API bindings. What follows are internal utilities. diff --git a/ext/jni/src/c/sqlite3-jni.h b/ext/jni/src/c/sqlite3-jni.h index 3baf8bef33..89e723527b 100644 --- a/ext/jni/src/c/sqlite3-jni.h +++ b/ext/jni/src/c/sqlite3-jni.h @@ -1776,6 +1776,14 @@ JNIEXPORT jint JNICALL Java_org_sqlite_jni_Fts5ExtensionApi_xSetAuxdata JNIEXPORT jint JNICALL Java_org_sqlite_jni_Fts5ExtensionApi_xTokenize (JNIEnv *, jobject, jobject, jbyteArray, jobject); +/* + * Class: org_sqlite_jni_Fts5ExtensionApi + * Method: xUserData + * Signature: (Lorg/sqlite/jni/Fts5Context;)Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_org_sqlite_jni_Fts5ExtensionApi_xUserData + (JNIEnv *, jobject, jobject); + #ifdef __cplusplus } #endif @@ -1800,10 +1808,10 @@ JNIEXPORT jobject JNICALL Java_org_sqlite_jni_fts5_1api_getInstanceForDb /* * Class: org_sqlite_jni_fts5_api * Method: xCreateFunction - * Signature: (Ljava/lang/String;Lorg/sqlite/jni/fts5_api/fts5_extension_function;)I + * Signature: (Ljava/lang/String;Ljava/lang/Object;Lorg/sqlite/jni/fts5_api/fts5_extension_function;)I */ JNIEXPORT jint JNICALL Java_org_sqlite_jni_fts5_1api_xCreateFunction - (JNIEnv *, jobject, jstring, jobject); + (JNIEnv *, jobject, jstring, jobject, jobject); #ifdef __cplusplus } diff --git a/ext/jni/src/org/sqlite/jni/Fts5ExtensionApi.java b/ext/jni/src/org/sqlite/jni/Fts5ExtensionApi.java index 328ed4c1d3..d4e47e714b 100644 --- a/ext/jni/src/org/sqlite/jni/Fts5ExtensionApi.java +++ b/ext/jni/src/org/sqlite/jni/Fts5ExtensionApi.java @@ -90,9 +90,7 @@ public final class Fts5ExtensionApi extends NativePointerHolder xDestroyCalled = new ValueHolder<>(false); ValueHolder xFuncCount = new ValueHolder<>(0); fts5_api.fts5_extension_function func = new fts5_api.fts5_extension_function(){ @@ -41,6 +42,7 @@ public class TesterFts5 { sqlite3_context pCx, sqlite3_value argv[]){ int nCols = ext.xColumnCount(fCx); affirm( 2 == nCols ); + affirm( ext.xUserData(fCx) == pUserData ); if(false){ OutputPointer.String op = new OutputPointer.String(); for(int i = 0; i < nCols; ++i ){ @@ -56,7 +58,7 @@ public class TesterFts5 { } }; - int rc = fApi.xCreateFunction("myaux", func); + int rc = fApi.xCreateFunction("myaux", pUserData, func); affirm( 0==rc ); affirm( 0==xFuncCount.value ); diff --git a/ext/jni/src/org/sqlite/jni/fts5_api.java b/ext/jni/src/org/sqlite/jni/fts5_api.java index 6f48859769..9bbaf1be7e 100644 --- a/ext/jni/src/org/sqlite/jni/fts5_api.java +++ b/ext/jni/src/org/sqlite/jni/fts5_api.java @@ -33,6 +33,13 @@ public final class fts5_api extends NativePointerHolder { public static native fts5_api getInstanceForDb(@NotNull sqlite3 db); public static abstract class fts5_extension_function { + // typedef void (*fts5_extension_function)( + // const Fts5ExtensionApi *pApi, /* API offered by current FTS version */ + // Fts5Context *pFts, /* First arg to pass to pApi functions */ + // sqlite3_context *pCtx, /* Context for returning result/error */ + // int nVal, /* Number of values in apVal[] array */ + // sqlite3_value **apVal /* Array of trailing arguments */ + // ); public abstract void xFunction(Fts5ExtensionApi ext, Fts5Context fCx, sqlite3_context pCx, sqlite3_value argv[]); //! Optionally override @@ -65,14 +72,12 @@ public final class fts5_api extends NativePointerHolder { // ); public native int xCreateFunction(@NotNull String name, + @Nullable Object userData, @NotNull fts5_extension_function xFunction); - // typedef void (*fts5_extension_function)( - // const Fts5ExtensionApi *pApi, /* API offered by current FTS version */ - // Fts5Context *pFts, /* First arg to pass to pApi functions */ - // sqlite3_context *pCtx, /* Context for returning result/error */ - // int nVal, /* Number of values in apVal[] array */ - // sqlite3_value **apVal /* Array of trailing arguments */ - // ); + public int xCreateFunction(@NotNull String name, + @NotNull fts5_extension_function xFunction){ + return xCreateFunction(name, null, xFunction); + } } diff --git a/manifest b/manifest index e0927b1bd7..b868bf4c51 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\smissing\sFts5PhraseIter.java\sto\sthe\sbuild. -D 2023-08-05T04:30:31.709 +C Bind\sFts5ExtensionApi::xUserData()\sto\sJNI\sand\sextend\sxCreateFunction()\sto\saccept\sthat\sargument.\sIn\stest\scode,\suse\sassert()\sinstead\sof\sexceptions\sif\sassert()\sis\senabled\sso\sthat\stest\sfailures\s(exceptions)\sthrown\svia\scallbacks\sdo\snot\sget\ssuppressed\s(which\sthey\sotherwise\snecessarily\sare\sto\savoid\scrashing\sthe\shost\sapp). +D 2023-08-05T11:16:54.971 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -232,15 +232,15 @@ F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282 F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8 F ext/jni/GNUmakefile a875d018a336ae47803cc5ca2768399beaf7b164734612ae9318f56256fc9779 F ext/jni/README.md 6ff7e1f4100dee980434a6ee37a199b653bceec62e233a6e2ccde6e7ae0c58bf -F ext/jni/src/c/sqlite3-jni.c 71a03f5348cf5b7be149d46dfe3b0210660e819383d3ba25e0733df572cf0bdc -F ext/jni/src/c/sqlite3-jni.h 526531f90d51a27e808f0758a3965b79bf92c2dd06c1fbcd3f8c37378bba7afd +F ext/jni/src/c/sqlite3-jni.c db90d821b0129b95ec804bbeab3e223eea34d307a042eab54cdaaeae9e36ec02 +F ext/jni/src/c/sqlite3-jni.h 7bc36622b63d858b06441b19a2f51be9fc1cf2f8177eb28cf5888c4ab6bd930d 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/Fts5.java 13844685231e8b4840a706db3bed84d5dfcf15be0ae7e809eac40420dba24901 F ext/jni/src/org/sqlite/jni/Fts5Context.java 0a5a02047a6a1dd3e4a38b0e542a8dd2de365033ba30e6ae019a676305959890 -F ext/jni/src/org/sqlite/jni/Fts5ExtensionApi.java c2180031e76ba3079be33ef5cae7e3e383f12208845cfc4e0107a00ea82df151 +F ext/jni/src/org/sqlite/jni/Fts5ExtensionApi.java eab47de28f43ea5deabf9f3da863067c99f96713421bfad7bebb24bcacef4d1c F ext/jni/src/org/sqlite/jni/Fts5Function.java 65cde7151e441fee012250a5e03277de7babcd11a0c308a832b7940574259bcc F ext/jni/src/org/sqlite/jni/Fts5PhraseIter.java 6642beda341c0b1b46af4e2d7f6f9ab03a7aede43277b2c92859176d6bce3be9 F ext/jni/src/org/sqlite/jni/Fts5Tokenizer.java 91489893596b6528c0df5cd7180bd5b55809c26e2b797fb321dfcdbc1298c060 @@ -250,12 +250,12 @@ F ext/jni/src/org/sqlite/jni/ProgressHandler.java 5979450e996416d28543f1d42634d3 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 1c470a8cdb5c61218304eb76b1188e98e562b105eac816557ef512e1b48fa55a -F ext/jni/src/org/sqlite/jni/Tester1.java aaf6cc2c7e01e78eb208f14afa3977862eaae7dd13040acbd302544ae50c21c3 -F ext/jni/src/org/sqlite/jni/TesterFts5.java 9d904ff312eb63b516311c846a2d1aee52e4e2d0b2e3520704624fefb8a94480 +F ext/jni/src/org/sqlite/jni/Tester1.java e094dca4c2760dba5cd169906f19a01fb7509a318d47fa76de537a6e610c1c47 +F ext/jni/src/org/sqlite/jni/TesterFts5.java 52f36beeb8cd61f31d3fb001bef88befd0c7ce55ed0d94476f9bdfe0dadd46cc 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 794bc2bb5850333f0a4e9df557102747b6cb6064b74ecd74dcdbd0d9e0c86eb4 +F ext/jni/src/org/sqlite/jni/fts5_api.java 97c693d095bfc826c6a2e2906a1fbf53bcbb0aba7798e1135d7957d17d4ad3d4 F ext/jni/src/org/sqlite/jni/fts5_tokenizer.java e530b36e6437fcc500e95d5d75fbffe272bdea20d2fac6be2e1336c578fba98b F ext/jni/src/org/sqlite/jni/sqlite3.java 600c3ddc1ac28ee8f58669fb435fd0d21f2972c652039361fde907d4fe44eb58 F ext/jni/src/org/sqlite/jni/sqlite3_context.java d26573fc7b309228cb49786e9078597d96232257defa955a3425d10897bca810 @@ -2080,8 +2080,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 c653bf16cbdccae05ab14059b140191afd5c17740fb78d756d8822986e54b17c -R 3768b7bcb33c3430a4b5a25821d24a54 +P 96281ad0d5b2f020622c4f85f8694886e6a29fb43e1fbeb2a346ed2e94f109fb +R f5fddb77ac440b71910871c77b4331be U stephan -Z 400a35d64a4cd5e9266ab634c954577a +Z 93c24d40c86efbed9f0183e7bb02737a # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 29afa1b6a1..a02a8a1032 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -96281ad0d5b2f020622c4f85f8694886e6a29fb43e1fbeb2a346ed2e94f109fb \ No newline at end of file +e43837377696e468cd31cf71585fe235ffe67a9f4d3b036c5f9d0cb7141d0f57 \ No newline at end of file