From: stephan Date: Mon, 31 Jul 2023 09:45:49 +0000 (+0000) Subject: Refactor the collation-specific JNI hook type to use the generic hook type. X-Git-Tag: version-3.43.0~47^2~120 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=46c46e400a6e57173df14b904cc03b4539128246;p=thirdparty%2Fsqlite.git Refactor the collation-specific JNI hook type to use the generic hook type. FossilOrigin-Name: 02c1d3b6501fedf3d6e6d1ca60699df268522182c5ba3b49ae8f4691499ef0fc --- diff --git a/ext/jni/src/c/sqlite3-jni.c b/ext/jni/src/c/sqlite3-jni.c index 55484bb5d4..b6e19a10a7 100644 --- a/ext/jni/src/c/sqlite3-jni.c +++ b/ext/jni/src/c/sqlite3-jni.c @@ -337,6 +337,7 @@ typedef struct JniHookState JniHookState; struct JniHookState{ jobject jObj /* global ref to Java instance */; jmethodID midCallback /* callback method */; + jclass klazz /* jObj's class. Not needed by all types. */; }; /** @@ -384,6 +385,7 @@ struct PerDbStateJni { JniHookState commitHook; JniHookState rollbackHook; JniHookState updateHook; + JniHookState collation; JniHookState collationNeeded; BusyHandlerJni busyHandler; }; @@ -725,9 +727,13 @@ static PerDbStateJni * PerDbStateJni_alloc(JNIEnv *env, sqlite3 *pDb, jobject jD return rv; } -static void JniHookState_unref(JNIEnv * const env, JniHookState * const s){ +static void JniHookState_unref(JNIEnv * const env, JniHookState * const s, int doXDestroy){ + if(doXDestroy && s->klazz && s->jObj){ + s3jni_call_xDestroy(env, s->jObj, s->klazz); + } UNREF_G(s->jObj); - //UNREF_G_(s->klazz); + UNREF_G(s->klazz); + memset(s, 0, sizeof(JniHookState)); } /** @@ -748,12 +754,14 @@ static void PerDbStateJni_set_aside(PerDbStateJni * const s){ assert(!s->pPrev); S3Global.perDb.aUsed = s->pNext; } -#define UNHOOK(MEMBER) JniHookState_unref(env, &s->MEMBER) - UNHOOK(trace); - UNHOOK(progress); - UNHOOK(commitHook); - UNHOOK(rollbackHook); - UNHOOK(updateHook); +#define UNHOOK(MEMBER,XDESTROY) JniHookState_unref(env, &s->MEMBER, XDESTROY) + UNHOOK(trace, 0); + UNHOOK(progress, 0); + UNHOOK(commitHook, 0); + UNHOOK(rollbackHook, 0); + UNHOOK(updateHook, 0); + UNHOOK(collation, 1); + UNHOOK(collationNeeded, 1); #undef UNHOOK UNREF_G(s->jDb); BusyHandlerJni_clear(env, &s->busyHandler); @@ -911,36 +919,10 @@ static int encodingTypeIsValid(int eTextRep){ } } -/** - State for binding Java-side collation sequences. -*/ -typedef struct { - jclass klazz /* Collation object's class */; - jobject oCollation /* Collation instance */; - jmethodID midCompare /* cached xCompare */; - JNIEnv * env; /* env registered from */; -} CollationState; - -static CollationState * CollationState_alloc(void){ - CollationState * rc = sqlite3_malloc(sizeof(CollationState)); - if(rc) memset(rc, 0, sizeof(CollationState)); - return rc; -} - -static void CollationState_free(CollationState * const cs){ - JNIEnv * const env = cs->env; - if(env){ - //MARKER(("Collation cleanup...\n")); - UNREF_G(cs->oCollation); - UNREF_G(cs->klazz); - } - sqlite3_free(cs); -} - static int CollationState_xCompare(void *pArg, int nLhs, const void *lhs, int nRhs, const void *rhs){ - CollationState * const cs = pArg; - JNIEnv * env = cs->env; + PerDbStateJni * const ps = pArg; + JNIEnv * env = ps->env; jint rc = 0; jbyteArray jbaLhs = (*env)->NewByteArray(env, (jint)nLhs); jbyteArray jbaRhs = jbaLhs ? (*env)->NewByteArray(env, (jint)nRhs) : NULL; @@ -950,7 +932,7 @@ static int CollationState_xCompare(void *pArg, int nLhs, const void *lhs, } (*env)->SetByteArrayRegion(env, jbaLhs, 0, (jint)nLhs, (const jbyte*)lhs); (*env)->SetByteArrayRegion(env, jbaRhs, 0, (jint)nRhs, (const jbyte*)rhs); - rc = (*env)->CallIntMethod(env, cs->oCollation, cs->midCompare, + rc = (*env)->CallIntMethod(env, ps->collation.jObj, ps->collation.midCallback, jbaLhs, jbaRhs); EXCEPTION_IGNORE; UNREF_L(jbaLhs); @@ -960,9 +942,8 @@ static int CollationState_xCompare(void *pArg, int nLhs, const void *lhs, /* Collation finalizer for use by the sqlite3 internals. */ static void CollationState_xDestroy(void *pArg){ - CollationState * const cs = pArg; - s3jni_call_xDestroy(cs->env, cs->oCollation, cs->klazz); - CollationState_free(cs); + PerDbStateJni * const ps = pArg; + JniHookState_unref( ps->env, &ps->collation, 1 ); } /* State for sqlite3_result_java_object() and @@ -1728,25 +1709,35 @@ JDECL(jobject,1context_1db_1handle)(JENV_JSELF, jobject jpCx){ return db ? new_sqlite3_wrapper(env, db) : NULL; } -JDECL(jint,1create_1collation)(JENV_JSELF, jobject jpDb, +JDECL(jint,1create_1collation)(JENV_JSELF, jobject jDb, jstring name, jint eTextRep, jobject oCollation){ - const jclass klazz = (*env)->GetObjectClass(env, oCollation); + PerDbStateJni * const ps = PerDbStateJni_for_db(env, jDb, 0, 0); + jclass klazz; int rc; const char *zName; - CollationState * const cs = CollationState_alloc(); - if(!cs) return (jint)SQLITE_NOMEM; - cs->env = env; - cs->oCollation = REF_G(oCollation); - cs->klazz = REF_G(klazz); - cs->midCompare = (*env)->GetMethodID(env, klazz, "xCompare", - "([B[B)I"); + JniHookState * pHook; + if(!ps) return (jint)SQLITE_NOMEM; + pHook = &ps->collation; + klazz = (*env)->GetObjectClass(env, oCollation); + pHook->midCallback = (*env)->GetMethodID(env, klazz, "xCompare", + "([B[B)I"); + IFTHREW{ + EXCEPTION_REPORT; + return s3jni_db_error(ps->pDb, SQLITE_ERROR, + "Could not get xCompare() method for object."); + } zName = JSTR_TOC(name); - rc = sqlite3_create_collation_v2(PtrGet_sqlite3(jpDb), zName, (int)eTextRep, - cs, CollationState_xCompare, + rc = sqlite3_create_collation_v2(ps->pDb, zName, (int)eTextRep, + ps, CollationState_xCompare, CollationState_xDestroy); JSTR_RELEASE(name, zName); - if(0 != rc) CollationState_xDestroy(cs); + if( 0==rc ){ + pHook->jObj = REF_G(oCollation); + pHook->klazz = REF_G(klazz); + }else{ + JniHookState_unref(env, pHook, 1); + } return (jint)rc; } diff --git a/manifest b/manifest index ea0069b0c1..cde7e0a83e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Internal\sJNI\sdoc\stweaks. -D 2023-07-31T09:28:15.075 +C Refactor\sthe\scollation-specific\sJNI\shook\stype\sto\suse\sthe\sgeneric\shook\stype. +D 2023-07-31T09:45:49.092 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -232,7 +232,7 @@ F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282 F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8 F ext/jni/GNUmakefile 56a014dbff9516774d895ec1ae9df0ed442765b556f79a0fc0b5bc438217200d F ext/jni/README.md c0e6e80935e7761acead89b69c87765b23a6bcb2858c321c3d05681fd338292a -F ext/jni/src/c/sqlite3-jni.c d92a945e490d05878da10449fcb8a1d50f04357557d409a85d53bbe27cb5c532 +F ext/jni/src/c/sqlite3-jni.c 31cf7df43d9c7e99431260e9ec0fbc622587e875ab22b3f4f6a262fd77bf16c8 F ext/jni/src/c/sqlite3-jni.h 28def286ee305c1c89a43ac5918a6862d985d0534f7ccbbd74df4885d3918b73 F ext/jni/src/org/sqlite/jni/BusyHandler.java 1b1d3e5c86cd796a0580c81b6af6550ad943baa25e47ada0dcca3aff3ebe978c F ext/jni/src/org/sqlite/jni/Collation.java 8dffbb00938007ad0967b2ab424d3c908413af1bbd3d212b9c9899910f1218d1 @@ -2071,8 +2071,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 24c0763d0e025187c74002ffee11fd48d3cd7b40e01469d28484bb67f701884b -R 7bd2b6ba1e43d037c3e290268c0148cb +P f4aa2c82882cb6be1fd52977de19fd03c2e38abb857b520f951b32d610972ab6 +R 3fb71491075a1e3e33a1832011a5ad65 U stephan -Z 1e5d7f469bee5667fa6677ac776d2be7 +Z 6de14785676dadf1719d78be6df968a1 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index dd90728405..690cb470a8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f4aa2c82882cb6be1fd52977de19fd03c2e38abb857b520f951b32d610972ab6 \ No newline at end of file +02c1d3b6501fedf3d6e6d1ca60699df268522182c5ba3b49ae8f4691499ef0fc \ No newline at end of file