mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
Remove unnecessary jclass-type struct members.
FossilOrigin-Name: d67255f7251cc5d1d27d77d4c84ff216e2da71202db989718189a6b4beff1cd0
This commit is contained in:
@ -356,7 +356,7 @@ struct S3JniNphClass {
|
|||||||
** NativePointerHolder subclass represented by
|
** NativePointerHolder subclass represented by
|
||||||
** zClassName */;
|
** zClassName */;
|
||||||
volatile jmethodID midCtor /* klazz's no-arg constructor. Used by
|
volatile jmethodID midCtor /* klazz's no-arg constructor. Used by
|
||||||
** new_NativePointerHolder_object(). */;
|
** new_NativePointerHolder_object(). */;
|
||||||
volatile jfieldID fidValue /* NativePointerHolder.nativePointer or
|
volatile jfieldID fidValue /* NativePointerHolder.nativePointer or
|
||||||
** OutputPointer.T.value */;
|
** OutputPointer.T.value */;
|
||||||
volatile jfieldID fidAggCtx /* sqlite3_context::aggregateContext. Used only
|
volatile jfieldID fidAggCtx /* sqlite3_context::aggregateContext. Used only
|
||||||
@ -369,12 +369,6 @@ struct S3JniHook{
|
|||||||
jobject jObj /* global ref to Java instance */;
|
jobject jObj /* global ref to Java instance */;
|
||||||
jmethodID midCallback /* callback method. Signature depends on
|
jmethodID midCallback /* callback method. Signature depends on
|
||||||
** jObj's type */;
|
** jObj's type */;
|
||||||
jclass klazz /* global ref to jObj's class. Only needed
|
|
||||||
** by hooks which have an xDestroy() method.
|
|
||||||
** We can probably eliminate this and simply
|
|
||||||
** do the class lookup at the same
|
|
||||||
** (deferred) time we do the xDestroy()
|
|
||||||
** lookup. */;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -533,7 +527,6 @@ struct S3JniGlobalType {
|
|||||||
volatile jobject jFtsExt /* Global ref to Java singleton for the
|
volatile jobject jFtsExt /* Global ref to Java singleton for the
|
||||||
Fts5ExtensionApi instance. */;
|
Fts5ExtensionApi instance. */;
|
||||||
struct {
|
struct {
|
||||||
volatile jclass klazz /* Global ref to the Fts5Phrase iter class */;
|
|
||||||
jfieldID fidA /* Fts5Phrase::a member */;
|
jfieldID fidA /* Fts5Phrase::a member */;
|
||||||
jfieldID fidB /* Fts5Phrase::b member */;
|
jfieldID fidB /* Fts5Phrase::b member */;
|
||||||
} jPhraseIter;
|
} jPhraseIter;
|
||||||
@ -860,6 +853,7 @@ static char * s3jni_exception_error_msg(JNIEnv * const env, jthrowable jx ){
|
|||||||
char * zMsg;
|
char * zMsg;
|
||||||
jclass const klazz = (*env)->GetObjectClass(env, jx);
|
jclass const klazz = (*env)->GetObjectClass(env, jx);
|
||||||
mid = (*env)->GetMethodID(env, klazz, "toString", "()Ljava/lang/String;");
|
mid = (*env)->GetMethodID(env, klazz, "toString", "()Ljava/lang/String;");
|
||||||
|
UNREF_L(klazz);
|
||||||
IFTHREW{
|
IFTHREW{
|
||||||
EXCEPTION_REPORT;
|
EXCEPTION_REPORT;
|
||||||
EXCEPTION_CLEAR;
|
EXCEPTION_CLEAR;
|
||||||
@ -905,20 +899,18 @@ static int s3jni_db_exception(JNIEnv * const env, S3JniDb * const ps,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Extracts the (void xDestroy()) method from the given jclass and
|
** Extracts the (void xDestroy()) method from jObj and applies it to
|
||||||
** applies it to jobj. If jObj is NULL, this is a no-op. If klazz is
|
** jObj. If jObj is NULL, this is a no-op. The lack of an xDestroy()
|
||||||
** NULL then it's derived from jobj. The lack of an xDestroy() method
|
** method is silently ignored and any exceptions thrown by xDestroy()
|
||||||
** is silently ignored and any exceptions thrown by xDestroy() trigger
|
** trigger a warning to stdout or stderr and then the exception is
|
||||||
** a warning to stdout or stderr and then the exception is suppressed.
|
** suppressed.
|
||||||
*/
|
*/
|
||||||
static void s3jni_call_xDestroy(JNIEnv * const env, jobject jObj, jclass klazz){
|
static void s3jni_call_xDestroy(JNIEnv * const env, jobject jObj){
|
||||||
if(jObj){
|
if(jObj){
|
||||||
jmethodID method;
|
jclass const klazz = (*env)->GetObjectClass(env, jObj);
|
||||||
if(!klazz){
|
jmethodID method = (*env)->GetMethodID(env, klazz, "xDestroy", "()V");
|
||||||
klazz = (*env)->GetObjectClass(env, jObj);
|
|
||||||
assert(klazz);
|
UNREF_L(klazz);
|
||||||
}
|
|
||||||
method = (*env)->GetMethodID(env, klazz, "xDestroy", "()V");
|
|
||||||
if(method){
|
if(method){
|
||||||
s3jni_incr( &SJG.metrics.nDestroy );
|
s3jni_incr( &SJG.metrics.nDestroy );
|
||||||
(*env)->CallVoidMethod(env, jObj, method);
|
(*env)->CallVoidMethod(env, jObj, method);
|
||||||
@ -927,6 +919,7 @@ static void s3jni_call_xDestroy(JNIEnv * const env, jobject jObj, jclass klazz){
|
|||||||
EXCEPTION_CLEAR;
|
EXCEPTION_CLEAR;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
|
/* Non-fatal. */
|
||||||
EXCEPTION_CLEAR;
|
EXCEPTION_CLEAR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -934,17 +927,16 @@ static void s3jni_call_xDestroy(JNIEnv * const env, jobject jObj, jclass klazz){
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
** Removes any Java references from s and clears its state. If
|
** Removes any Java references from s and clears its state. If
|
||||||
** doXDestroy is true and s->klazz and s->jObj are not NULL, s->jObj's
|
** doXDestroy is true and s->jObj is not NULL, s->jObj's
|
||||||
** s is passed to s3jni_call_xDestroy() before any references are
|
** s is passed to s3jni_call_xDestroy() before any references are
|
||||||
** cleared. It is legal to call this when the object has no Java
|
** cleared. It is legal to call this when the object has no Java
|
||||||
** references.
|
** references.
|
||||||
*/
|
*/
|
||||||
static void S3JniHook_unref(JNIEnv * const env, S3JniHook * const s, int doXDestroy){
|
static void S3JniHook_unref(JNIEnv * const env, S3JniHook * const s, int doXDestroy){
|
||||||
if(doXDestroy && s->klazz && s->jObj){
|
if(doXDestroy && s->jObj){
|
||||||
s3jni_call_xDestroy(env, s->jObj, s->klazz);
|
s3jni_call_xDestroy(env, s->jObj);
|
||||||
}
|
}
|
||||||
UNREF_G(s->jObj);
|
UNREF_G(s->jObj);
|
||||||
UNREF_G(s->klazz);
|
|
||||||
memset(s, 0, sizeof(*s));
|
memset(s, 0, sizeof(*s));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1198,16 +1190,12 @@ static void S3JniAutoExtension_clear(JNIEnv * const env,
|
|||||||
static int S3JniAutoExtension_init(JNIEnv *const env,
|
static int S3JniAutoExtension_init(JNIEnv *const env,
|
||||||
S3JniAutoExtension * const ax,
|
S3JniAutoExtension * const ax,
|
||||||
jobject const jAutoExt){
|
jobject const jAutoExt){
|
||||||
jclass klazz;
|
jclass const klazz = (*env)->GetObjectClass(env, jAutoExt);
|
||||||
klazz = (*env)->GetObjectClass(env, jAutoExt);
|
|
||||||
if(!klazz){
|
|
||||||
S3JniAutoExtension_clear(env, ax);
|
|
||||||
return SQLITE_ERROR;
|
|
||||||
}
|
|
||||||
ax->midFunc = (*env)->GetMethodID(env, klazz, "xEntryPoint",
|
ax->midFunc = (*env)->GetMethodID(env, klazz, "xEntryPoint",
|
||||||
"(Lorg/sqlite/jni/sqlite3;)I");
|
"(Lorg/sqlite/jni/sqlite3;)I");
|
||||||
EXCEPTION_WARN_IGNORE;
|
|
||||||
UNREF_L(klazz);
|
UNREF_L(klazz);
|
||||||
|
EXCEPTION_WARN_IGNORE;
|
||||||
if(!ax->midFunc){
|
if(!ax->midFunc){
|
||||||
MARKER(("Error getting xEntryPoint(sqlite3) from AutoExtension object."));
|
MARKER(("Error getting xEntryPoint(sqlite3) from AutoExtension object."));
|
||||||
S3JniAutoExtension_clear(env, ax);
|
S3JniAutoExtension_clear(env, ax);
|
||||||
@ -1245,8 +1233,7 @@ static int udf_setAggregateContext(JNIEnv * env, jobject jCx,
|
|||||||
if(!pNC->fidAggCtx){
|
if(!pNC->fidAggCtx){
|
||||||
MUTEX_NPH_ENTER;
|
MUTEX_NPH_ENTER;
|
||||||
if(!pNC->fidAggCtx){
|
if(!pNC->fidAggCtx){
|
||||||
pNC->fidAggCtx = (*env)->GetFieldID(env, pNC->klazz,
|
pNC->fidAggCtx = (*env)->GetFieldID(env, pNC->klazz, "aggregateContext", "J");
|
||||||
"aggregateContext", "J");
|
|
||||||
EXCEPTION_IS_FATAL("Cannot get sqlite3_contex.aggregateContext member.");
|
EXCEPTION_IS_FATAL("Cannot get sqlite3_contex.aggregateContext member.");
|
||||||
}
|
}
|
||||||
MUTEX_NPH_LEAVE;
|
MUTEX_NPH_LEAVE;
|
||||||
@ -1540,7 +1527,6 @@ typedef void (*udf_xFinal_f)(sqlite3_context*);
|
|||||||
typedef struct S3JniUdf S3JniUdf;
|
typedef struct S3JniUdf S3JniUdf;
|
||||||
struct S3JniUdf {
|
struct S3JniUdf {
|
||||||
jobject jObj /* SQLFunction instance */;
|
jobject jObj /* SQLFunction instance */;
|
||||||
jclass klazz /* jObj's class */;
|
|
||||||
char * zFuncName /* Only for error reporting and debug logging */;
|
char * zFuncName /* Only for error reporting and debug logging */;
|
||||||
enum UDFType type;
|
enum UDFType type;
|
||||||
/** Method IDs for the various UDF methods. */
|
/** Method IDs for the various UDF methods. */
|
||||||
@ -1558,11 +1544,12 @@ static S3JniUdf * S3JniUdf_alloc(JNIEnv * const env, jobject jObj){
|
|||||||
"(Lorg/sqlite/jni/sqlite3_context;[Lorg/sqlite/jni/sqlite3_value;)V";
|
"(Lorg/sqlite/jni/sqlite3_context;[Lorg/sqlite/jni/sqlite3_value;)V";
|
||||||
const char * zFV = /* signature for xFinal, xValue */
|
const char * zFV = /* signature for xFinal, xValue */
|
||||||
"(Lorg/sqlite/jni/sqlite3_context;)V";
|
"(Lorg/sqlite/jni/sqlite3_context;)V";
|
||||||
|
jclass const klazz = (*env)->GetObjectClass(env, jObj);
|
||||||
|
|
||||||
memset(s, 0, sizeof(S3JniUdf));
|
memset(s, 0, sizeof(S3JniUdf));
|
||||||
s->jObj = REF_G(jObj);
|
s->jObj = REF_G(jObj);
|
||||||
s->klazz = REF_G((*env)->GetObjectClass(env, jObj));
|
|
||||||
#define FGET(FuncName,FuncType,Field) \
|
#define FGET(FuncName,FuncType,Field) \
|
||||||
s->Field = (*env)->GetMethodID(env, s->klazz, FuncName, FuncType); \
|
s->Field = (*env)->GetMethodID(env, klazz, FuncName, FuncType); \
|
||||||
if(!s->Field) (*env)->ExceptionClear(env)
|
if(!s->Field) (*env)->ExceptionClear(env)
|
||||||
FGET("xFunc", zFSI, jmidxFunc);
|
FGET("xFunc", zFSI, jmidxFunc);
|
||||||
FGET("xStep", zFSI, jmidxStep);
|
FGET("xStep", zFSI, jmidxStep);
|
||||||
@ -1570,6 +1557,7 @@ static S3JniUdf * S3JniUdf_alloc(JNIEnv * const env, jobject jObj){
|
|||||||
FGET("xValue", zFV, jmidxValue);
|
FGET("xValue", zFV, jmidxValue);
|
||||||
FGET("xInverse", zFSI, jmidxInverse);
|
FGET("xInverse", zFSI, jmidxInverse);
|
||||||
#undef FGET
|
#undef FGET
|
||||||
|
UNREF_L(klazz);
|
||||||
if(s->jmidxFunc) s->type = UDF_SCALAR;
|
if(s->jmidxFunc) s->type = UDF_SCALAR;
|
||||||
else if(s->jmidxStep && s->jmidxFinal){
|
else if(s->jmidxStep && s->jmidxFinal){
|
||||||
s->type = s->jmidxValue ? UDF_WINDOW : UDF_AGGREGATE;
|
s->type = s->jmidxValue ? UDF_WINDOW : UDF_AGGREGATE;
|
||||||
@ -1584,9 +1572,8 @@ static void S3JniUdf_free(S3JniUdf * s){
|
|||||||
LocalJniGetEnv;
|
LocalJniGetEnv;
|
||||||
if(env){
|
if(env){
|
||||||
//MARKER(("UDF cleanup: %s\n", s->zFuncName));
|
//MARKER(("UDF cleanup: %s\n", s->zFuncName));
|
||||||
s3jni_call_xDestroy(env, s->jObj, s->klazz);
|
s3jni_call_xDestroy(env, s->jObj);
|
||||||
UNREF_G(s->jObj);
|
UNREF_G(s->jObj);
|
||||||
UNREF_G(s->klazz);
|
|
||||||
}
|
}
|
||||||
sqlite3_free(s->zFuncName);
|
sqlite3_free(s->zFuncName);
|
||||||
sqlite3_free(s);
|
sqlite3_free(s);
|
||||||
@ -2024,10 +2011,12 @@ JDECL(jint,1busy_1handler)(JENV_CSELF, jobject jDb, jobject jBusy){
|
|||||||
/* Same object - this is a no-op. */
|
/* Same object - this is a no-op. */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
jclass klazz;
|
||||||
S3JniHook_unref(env, pHook, 1);
|
S3JniHook_unref(env, pHook, 1);
|
||||||
pHook->jObj = REF_G(jBusy);
|
pHook->jObj = REF_G(jBusy);
|
||||||
pHook->klazz = REF_G((*env)->GetObjectClass(env, jBusy));
|
klazz = (*env)->GetObjectClass(env, jBusy);
|
||||||
pHook->midCallback = (*env)->GetMethodID(env, pHook->klazz, "xCallback", "(I)I");
|
pHook->midCallback = (*env)->GetMethodID(env, klazz, "xCallback", "(I)I");
|
||||||
|
UNREF_L(klazz);
|
||||||
IFTHREW {
|
IFTHREW {
|
||||||
S3JniHook_unref(env, pHook, 0);
|
S3JniHook_unref(env, pHook, 0);
|
||||||
rc = SQLITE_ERROR;
|
rc = SQLITE_ERROR;
|
||||||
@ -2157,6 +2146,7 @@ JDECL(jint,1collation_1needed)(JENV_CSELF, jobject jDb, jobject jHook){
|
|||||||
klazz = (*env)->GetObjectClass(env, jHook);
|
klazz = (*env)->GetObjectClass(env, jHook);
|
||||||
xCallback = (*env)->GetMethodID(env, klazz, "xCollationNeeded",
|
xCallback = (*env)->GetMethodID(env, klazz, "xCollationNeeded",
|
||||||
"(Lorg/sqlite/jni/sqlite3;ILjava/lang/String;)I");
|
"(Lorg/sqlite/jni/sqlite3;ILjava/lang/String;)I");
|
||||||
|
UNREF_L(klazz);
|
||||||
IFTHREW {
|
IFTHREW {
|
||||||
rc = s3jni_db_exception(env, ps, SQLITE_MISUSE,
|
rc = s3jni_db_exception(env, ps, SQLITE_MISUSE,
|
||||||
"Cannot not find matching callback on "
|
"Cannot not find matching callback on "
|
||||||
@ -2275,6 +2265,7 @@ static jobject s3jni_commit_rollback_hook(int isCommit, JNIEnv * const env,
|
|||||||
xCallback = (*env)->GetMethodID(env, klazz,
|
xCallback = (*env)->GetMethodID(env, klazz,
|
||||||
isCommit ? "xCommitHook" : "xRollbackHook",
|
isCommit ? "xCommitHook" : "xRollbackHook",
|
||||||
isCommit ? "()I" : "()V");
|
isCommit ? "()I" : "()V");
|
||||||
|
UNREF_L(klazz);
|
||||||
IFTHREW {
|
IFTHREW {
|
||||||
EXCEPTION_REPORT;
|
EXCEPTION_REPORT;
|
||||||
EXCEPTION_CLEAR;
|
EXCEPTION_CLEAR;
|
||||||
@ -2371,6 +2362,7 @@ JDECL(jint,1config__Lorg_sqlite_jni_SQLLog_2)(JENV_CSELF, jobject jLog){
|
|||||||
S3JniHook tmpHook;
|
S3JniHook tmpHook;
|
||||||
S3JniHook * const hook = &tmpHook;
|
S3JniHook * const hook = &tmpHook;
|
||||||
S3JniHook * const hookOld = & SJG.hooks.sqllog;
|
S3JniHook * const hookOld = & SJG.hooks.sqllog;
|
||||||
|
jclass klazz;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
if( !jLog ){
|
if( !jLog ){
|
||||||
S3JniHook_unref(env, hookOld, 0);
|
S3JniHook_unref(env, hookOld, 0);
|
||||||
@ -2379,11 +2371,12 @@ JDECL(jint,1config__Lorg_sqlite_jni_SQLLog_2)(JENV_CSELF, jobject jLog){
|
|||||||
if( hookOld->jObj && (*env)->IsSameObject(env, jLog, hookOld->jObj) ){
|
if( hookOld->jObj && (*env)->IsSameObject(env, jLog, hookOld->jObj) ){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
hook->klazz = REF_G( (*env)->GetObjectClass(env, jLog) );
|
klazz = (*env)->GetObjectClass(env, jLog);
|
||||||
hook->midCallback = (*env)->GetMethodID(env, hook->klazz, "xSqllog",
|
hook->midCallback = (*env)->GetMethodID(env, klazz, "xSqllog",
|
||||||
"(Lorg/sqlite/jni/sqlite3;"
|
"(Lorg/sqlite/jni/sqlite3;"
|
||||||
"Ljava/lang/String;"
|
"Ljava/lang/String;"
|
||||||
"I)V");
|
"I)V");
|
||||||
|
UNREF_L(klazz);
|
||||||
if( !hook->midCallback ){
|
if( !hook->midCallback ){
|
||||||
EXCEPTION_WARN_IGNORE;
|
EXCEPTION_WARN_IGNORE;
|
||||||
S3JniHook_unref(env, hook, 0);
|
S3JniHook_unref(env, hook, 0);
|
||||||
@ -2423,8 +2416,9 @@ JDECL(jint,1create_1collation)(JENV_CSELF, jobject jDb,
|
|||||||
klazz = (*env)->GetObjectClass(env, oCollation);
|
klazz = (*env)->GetObjectClass(env, oCollation);
|
||||||
pHook->midCallback = (*env)->GetMethodID(env, klazz, "xCompare",
|
pHook->midCallback = (*env)->GetMethodID(env, klazz, "xCompare",
|
||||||
"([B[B)I");
|
"([B[B)I");
|
||||||
|
UNREF_L(klazz);
|
||||||
IFTHREW{
|
IFTHREW{
|
||||||
EXCEPTION_REPORT;
|
UNREF_L(klazz);
|
||||||
return s3jni_db_error(ps->pDb, SQLITE_ERROR,
|
return s3jni_db_error(ps->pDb, SQLITE_ERROR,
|
||||||
"Could not get xCompare() method for object.");
|
"Could not get xCompare() method for object.");
|
||||||
}
|
}
|
||||||
@ -2435,7 +2429,6 @@ JDECL(jint,1create_1collation)(JENV_CSELF, jobject jDb,
|
|||||||
JSTR_RELEASE(name, zName);
|
JSTR_RELEASE(name, zName);
|
||||||
if( 0==rc ){
|
if( 0==rc ){
|
||||||
pHook->jObj = REF_G(oCollation);
|
pHook->jObj = REF_G(oCollation);
|
||||||
pHook->klazz = REF_G(klazz);
|
|
||||||
}else{
|
}else{
|
||||||
S3JniHook_unref(env, pHook, 1);
|
S3JniHook_unref(env, pHook, 1);
|
||||||
}
|
}
|
||||||
@ -3000,6 +2993,7 @@ static jobject s3jni_updatepre_hook(JNIEnv * env, int isPre, jobject jDb, jobjec
|
|||||||
"JJ)V")
|
"JJ)V")
|
||||||
: (*env)->GetMethodID(env, klazz, "xUpdateHook",
|
: (*env)->GetMethodID(env, klazz, "xUpdateHook",
|
||||||
"(ILjava/lang/String;Ljava/lang/String;J)V");
|
"(ILjava/lang/String;Ljava/lang/String;J)V");
|
||||||
|
UNREF_L(klazz);
|
||||||
IFTHREW {
|
IFTHREW {
|
||||||
EXCEPTION_CLEAR;
|
EXCEPTION_CLEAR;
|
||||||
s3jni_db_error(ps->pDb, SQLITE_ERROR,
|
s3jni_db_error(ps->pDb, SQLITE_ERROR,
|
||||||
@ -3094,6 +3088,7 @@ JDECL(void,1progress_1handler)(JENV_CSELF,jobject jDb, jint n, jobject jProgress
|
|||||||
}
|
}
|
||||||
klazz = (*env)->GetObjectClass(env, jProgress);
|
klazz = (*env)->GetObjectClass(env, jProgress);
|
||||||
xCallback = (*env)->GetMethodID(env, klazz, "xCallback", "()I");
|
xCallback = (*env)->GetMethodID(env, klazz, "xCallback", "()I");
|
||||||
|
UNREF_L(klazz);
|
||||||
IFTHREW {
|
IFTHREW {
|
||||||
EXCEPTION_CLEAR;
|
EXCEPTION_CLEAR;
|
||||||
s3jni_db_error(ps->pDb, SQLITE_ERROR,
|
s3jni_db_error(ps->pDb, SQLITE_ERROR,
|
||||||
@ -3351,6 +3346,7 @@ JDECL(jint,1set_1authorizer)(JENV_CSELF,jobject jDb, jobject jHook){
|
|||||||
return (jint)sqlite3_set_authorizer( ps->pDb, 0, 0 );
|
return (jint)sqlite3_set_authorizer( ps->pDb, 0, 0 );
|
||||||
}else{
|
}else{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
jclass klazz;
|
||||||
if( pHook->jObj ){
|
if( pHook->jObj ){
|
||||||
if( (*env)->IsSameObject(env, pHook->jObj, jHook) ){
|
if( (*env)->IsSameObject(env, pHook->jObj, jHook) ){
|
||||||
/* Same object - this is a no-op. */
|
/* Same object - this is a no-op. */
|
||||||
@ -3359,8 +3355,8 @@ JDECL(jint,1set_1authorizer)(JENV_CSELF,jobject jDb, jobject jHook){
|
|||||||
S3JniHook_unref(env, pHook, 0);
|
S3JniHook_unref(env, pHook, 0);
|
||||||
}
|
}
|
||||||
pHook->jObj = REF_G(jHook);
|
pHook->jObj = REF_G(jHook);
|
||||||
pHook->klazz = REF_G((*env)->GetObjectClass(env, jHook));
|
klazz = (*env)->GetObjectClass(env, jHook);
|
||||||
pHook->midCallback = (*env)->GetMethodID(env, pHook->klazz,
|
pHook->midCallback = (*env)->GetMethodID(env, klazz,
|
||||||
"xAuth",
|
"xAuth",
|
||||||
"(I"
|
"(I"
|
||||||
"Ljava/lang/String;"
|
"Ljava/lang/String;"
|
||||||
@ -3368,6 +3364,7 @@ JDECL(jint,1set_1authorizer)(JENV_CSELF,jobject jDb, jobject jHook){
|
|||||||
"Ljava/lang/String;"
|
"Ljava/lang/String;"
|
||||||
"Ljava/lang/String;"
|
"Ljava/lang/String;"
|
||||||
")I");
|
")I");
|
||||||
|
UNREF_L(klazz);
|
||||||
IFTHREW {
|
IFTHREW {
|
||||||
S3JniHook_unref(env, pHook, 0);
|
S3JniHook_unref(env, pHook, 0);
|
||||||
return s3jni_db_error(ps->pDb, SQLITE_ERROR,
|
return s3jni_db_error(ps->pDb, SQLITE_ERROR,
|
||||||
@ -3536,6 +3533,7 @@ JDECL(jint,1trace_1v2)(JENV_CSELF,jobject jDb, jint traceMask, jobject jTracer){
|
|||||||
klazz = (*env)->GetObjectClass(env, jTracer);
|
klazz = (*env)->GetObjectClass(env, jTracer);
|
||||||
ps->hooks.trace.midCallback = (*env)->GetMethodID(env, klazz, "xCallback",
|
ps->hooks.trace.midCallback = (*env)->GetMethodID(env, klazz, "xCallback",
|
||||||
"(ILjava/lang/Object;Ljava/lang/Object;)I");
|
"(ILjava/lang/Object;Ljava/lang/Object;)I");
|
||||||
|
UNREF_L(klazz);
|
||||||
IFTHREW {
|
IFTHREW {
|
||||||
EXCEPTION_CLEAR;
|
EXCEPTION_CLEAR;
|
||||||
return s3jni_db_error(ps->pDb, SQLITE_ERROR,
|
return s3jni_db_error(ps->pDb, SQLITE_ERROR,
|
||||||
@ -3723,7 +3721,6 @@ JDECL(void,1do_1something_1for_1developer)(JENV_CSELF){
|
|||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
jobject jObj /* functor instance */;
|
jobject jObj /* functor instance */;
|
||||||
jclass klazz /* jObj's class */;
|
|
||||||
jobject jUserData /* 2nd arg to JNI binding of
|
jobject jUserData /* 2nd arg to JNI binding of
|
||||||
xCreateFunction(), ostensibly the 3rd arg
|
xCreateFunction(), ostensibly the 3rd arg
|
||||||
to the lib-level xCreateFunction(), except
|
to the lib-level xCreateFunction(), except
|
||||||
@ -3737,9 +3734,8 @@ static void Fts5JniAux_free(Fts5JniAux * const s){
|
|||||||
LocalJniGetEnv;
|
LocalJniGetEnv;
|
||||||
if(env){
|
if(env){
|
||||||
/*MARKER(("FTS5 aux function cleanup: %s\n", s->zFuncName));*/
|
/*MARKER(("FTS5 aux function cleanup: %s\n", s->zFuncName));*/
|
||||||
s3jni_call_xDestroy(env, s->jObj, s->klazz);
|
s3jni_call_xDestroy(env, s->jObj);
|
||||||
UNREF_G(s->jObj);
|
UNREF_G(s->jObj);
|
||||||
UNREF_G(s->klazz);
|
|
||||||
UNREF_G(s->jUserData);
|
UNREF_G(s->jUserData);
|
||||||
}
|
}
|
||||||
sqlite3_free(s->zFuncName);
|
sqlite3_free(s->zFuncName);
|
||||||
@ -3753,14 +3749,16 @@ static void Fts5JniAux_xDestroy(void *p){
|
|||||||
static Fts5JniAux * Fts5JniAux_alloc(JNIEnv * const env, jobject jObj){
|
static Fts5JniAux * Fts5JniAux_alloc(JNIEnv * const env, jobject jObj){
|
||||||
Fts5JniAux * s = sqlite3_malloc(sizeof(Fts5JniAux));
|
Fts5JniAux * s = sqlite3_malloc(sizeof(Fts5JniAux));
|
||||||
if(s){
|
if(s){
|
||||||
|
jclass klazz;
|
||||||
memset(s, 0, sizeof(Fts5JniAux));
|
memset(s, 0, sizeof(Fts5JniAux));
|
||||||
s->jObj = REF_G(jObj);
|
s->jObj = REF_G(jObj);
|
||||||
s->klazz = REF_G((*env)->GetObjectClass(env, jObj));
|
klazz = (*env)->GetObjectClass(env, jObj);
|
||||||
s->jmid = (*env)->GetMethodID(env, s->klazz, "xFunction",
|
s->jmid = (*env)->GetMethodID(env, klazz, "xFunction",
|
||||||
"(Lorg/sqlite/jni/Fts5ExtensionApi;"
|
"(Lorg/sqlite/jni/Fts5ExtensionApi;"
|
||||||
"Lorg/sqlite/jni/Fts5Context;"
|
"Lorg/sqlite/jni/Fts5Context;"
|
||||||
"Lorg/sqlite/jni/sqlite3_context;"
|
"Lorg/sqlite/jni/sqlite3_context;"
|
||||||
"[Lorg/sqlite/jni/sqlite3_value;)V");
|
"[Lorg/sqlite/jni/sqlite3_value;)V");
|
||||||
|
UNREF_L(klazz);
|
||||||
IFTHREW{
|
IFTHREW{
|
||||||
EXCEPTION_REPORT;
|
EXCEPTION_REPORT;
|
||||||
EXCEPTION_CLEAR;
|
EXCEPTION_CLEAR;
|
||||||
@ -3966,7 +3964,7 @@ static void S3JniFts5AuxData_xDestroy(void *x){
|
|||||||
S3JniFts5AuxData * const p = x;
|
S3JniFts5AuxData * const p = x;
|
||||||
if(p->jObj){
|
if(p->jObj){
|
||||||
LocalJniGetEnv;
|
LocalJniGetEnv;
|
||||||
s3jni_call_xDestroy(env, p->jObj, 0);
|
s3jni_call_xDestroy(env, p->jObj);
|
||||||
UNREF_G(p->jObj);
|
UNREF_G(p->jObj);
|
||||||
}
|
}
|
||||||
sqlite3_free(x);
|
sqlite3_free(x);
|
||||||
@ -4023,7 +4021,7 @@ static void s3jni_phraseIter_NToJ(JNIEnv *const env,
|
|||||||
Fts5PhraseIter const * const pSrc,
|
Fts5PhraseIter const * const pSrc,
|
||||||
jobject jIter){
|
jobject jIter){
|
||||||
S3JniGlobalType * const g = &S3JniGlobal;
|
S3JniGlobalType * const g = &S3JniGlobal;
|
||||||
assert(g->fts5.jPhraseIter.klazz);
|
assert(g->fts5.jPhraseIter.fidA);
|
||||||
(*env)->SetLongField(env, jIter, g->fts5.jPhraseIter.fidA, (jlong)pSrc->a);
|
(*env)->SetLongField(env, jIter, g->fts5.jPhraseIter.fidA, (jlong)pSrc->a);
|
||||||
EXCEPTION_IS_FATAL("Cannot set Fts5PhraseIter.a field.");
|
EXCEPTION_IS_FATAL("Cannot set Fts5PhraseIter.a field.");
|
||||||
(*env)->SetLongField(env, jIter, g->fts5.jPhraseIter.fidB, (jlong)pSrc->b);
|
(*env)->SetLongField(env, jIter, g->fts5.jPhraseIter.fidB, (jlong)pSrc->b);
|
||||||
@ -4034,7 +4032,7 @@ static void s3jni_phraseIter_NToJ(JNIEnv *const env,
|
|||||||
static void s3jni_phraseIter_JToN(JNIEnv *const env, jobject jIter,
|
static void s3jni_phraseIter_JToN(JNIEnv *const env, jobject jIter,
|
||||||
Fts5PhraseIter * const pDest){
|
Fts5PhraseIter * const pDest){
|
||||||
S3JniGlobalType * const g = &S3JniGlobal;
|
S3JniGlobalType * const g = &S3JniGlobal;
|
||||||
assert(g->fts5.jPhraseIter.klazz);
|
assert(g->fts5.jPhraseIter.fidA);
|
||||||
pDest->a =
|
pDest->a =
|
||||||
(const unsigned char *)(*env)->GetLongField(env, jIter, g->fts5.jPhraseIter.fidA);
|
(const unsigned char *)(*env)->GetLongField(env, jIter, g->fts5.jPhraseIter.fidA);
|
||||||
EXCEPTION_IS_FATAL("Cannot get Fts5PhraseIter.a field.");
|
EXCEPTION_IS_FATAL("Cannot get Fts5PhraseIter.a field.");
|
||||||
@ -4078,7 +4076,6 @@ JDECLFtsXA(void,xPhraseNext)(JENV_OSELF,jobject jCtx, jobject jIter,
|
|||||||
Fts5ExtDecl;
|
Fts5ExtDecl;
|
||||||
Fts5PhraseIter iter;
|
Fts5PhraseIter iter;
|
||||||
int iCol = 0, iOff = 0;
|
int iCol = 0, iOff = 0;
|
||||||
if(!SJG.fts5.jPhraseIter.klazz) return /*SQLITE_MISUSE*/;
|
|
||||||
s3jni_phraseIter_JToN(env, jIter, &iter);
|
s3jni_phraseIter_JToN(env, jIter, &iter);
|
||||||
fext->xPhraseNext(PtrGet_Fts5Context(jCtx), &iter, &iCol, &iOff);
|
fext->xPhraseNext(PtrGet_Fts5Context(jCtx), &iter, &iCol, &iOff);
|
||||||
OutputPointer_set_Int32(env, jOutCol, iCol);
|
OutputPointer_set_Int32(env, jOutCol, iCol);
|
||||||
@ -4091,7 +4088,6 @@ JDECLFtsXA(void,xPhraseNextColumn)(JENV_OSELF,jobject jCtx, jobject jIter,
|
|||||||
Fts5ExtDecl;
|
Fts5ExtDecl;
|
||||||
Fts5PhraseIter iter;
|
Fts5PhraseIter iter;
|
||||||
int iCol = 0;
|
int iCol = 0;
|
||||||
if(!SJG.fts5.jPhraseIter.klazz) return /*SQLITE_MISUSE*/;
|
|
||||||
s3jni_phraseIter_JToN(env, jIter, &iter);
|
s3jni_phraseIter_JToN(env, jIter, &iter);
|
||||||
fext->xPhraseNextColumn(PtrGet_Fts5Context(jCtx), &iter, &iCol);
|
fext->xPhraseNextColumn(PtrGet_Fts5Context(jCtx), &iter, &iCol);
|
||||||
OutputPointer_set_Int32(env, jOutCol, iCol);
|
OutputPointer_set_Int32(env, jOutCol, iCol);
|
||||||
@ -4151,6 +4147,7 @@ JDECLFtsXA(jint,xQueryPhrase)(JENV_OSELF,jobject jFcx, jint iPhrase,
|
|||||||
s.midCallback = (*env)->GetMethodID(env, klazz, "xCallback",
|
s.midCallback = (*env)->GetMethodID(env, klazz, "xCallback",
|
||||||
"(Lorg.sqlite.jni.Fts5ExtensionApi;"
|
"(Lorg.sqlite.jni.Fts5ExtensionApi;"
|
||||||
"Lorg.sqlite.jni.Fts5Context;)I");
|
"Lorg.sqlite.jni.Fts5Context;)I");
|
||||||
|
UNREF_L(klazz);
|
||||||
EXCEPTION_IS_FATAL("Could not extract xQueryPhraseCallback.xCallback method.");
|
EXCEPTION_IS_FATAL("Could not extract xQueryPhraseCallback.xCallback method.");
|
||||||
return (jint)fext->xQueryPhrase(PtrGet_Fts5Context(jFcx), iPhrase, &s,
|
return (jint)fext->xQueryPhrase(PtrGet_Fts5Context(jFcx), iPhrase, &s,
|
||||||
s3jni_xQueryPhrase);
|
s3jni_xQueryPhrase);
|
||||||
@ -4179,7 +4176,7 @@ JDECLFtsXA(int,xSetAuxdata)(JENV_OSELF,jobject jCtx, jobject jAux){
|
|||||||
if(jAux){
|
if(jAux){
|
||||||
/* Emulate how xSetAuxdata() behaves when it cannot alloc
|
/* Emulate how xSetAuxdata() behaves when it cannot alloc
|
||||||
** its auxdata wrapper. */
|
** its auxdata wrapper. */
|
||||||
s3jni_call_xDestroy(env, jAux, 0);
|
s3jni_call_xDestroy(env, jAux);
|
||||||
}
|
}
|
||||||
return SQLITE_NOMEM;
|
return SQLITE_NOMEM;
|
||||||
}
|
}
|
||||||
@ -4237,6 +4234,7 @@ static jint s3jni_fts5_xTokenize(JENV_OSELF, S3NphRef const *pRef,
|
|||||||
s.jFcx = jFcx;
|
s.jFcx = jFcx;
|
||||||
s.fext = fext;
|
s.fext = fext;
|
||||||
s.midCallback = (*env)->GetMethodID(env, klazz, "xToken", "(I[BII)I");
|
s.midCallback = (*env)->GetMethodID(env, klazz, "xToken", "(I[BII)I");
|
||||||
|
UNREF_L(klazz);
|
||||||
IFTHREW {
|
IFTHREW {
|
||||||
EXCEPTION_REPORT;
|
EXCEPTION_REPORT;
|
||||||
EXCEPTION_CLEAR;
|
EXCEPTION_CLEAR;
|
||||||
@ -4606,16 +4604,17 @@ Java_org_sqlite_jni_SQLite3Jni_init(JENV_CSELF){
|
|||||||
SJG.g.oCharsetUtf8 =
|
SJG.g.oCharsetUtf8 =
|
||||||
REF_G((*env)->GetStaticObjectField(env, klazz, fUtf8));
|
REF_G((*env)->GetStaticObjectField(env, klazz, fUtf8));
|
||||||
EXCEPTION_IS_FATAL("Error getting reference to StandardCharsets.UTF_8.");
|
EXCEPTION_IS_FATAL("Error getting reference to StandardCharsets.UTF_8.");
|
||||||
|
UNREF_L(klazz);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SQLITE_ENABLE_FTS5
|
#ifdef SQLITE_ENABLE_FTS5
|
||||||
klazz = (*env)->FindClass(env, "org/sqlite/jni/Fts5PhraseIter");
|
klazz = (*env)->FindClass(env, "org/sqlite/jni/Fts5PhraseIter");
|
||||||
EXCEPTION_IS_FATAL("Error getting reference to org.sqlite.jni.Fts5PhraseIter.");
|
EXCEPTION_IS_FATAL("Error getting reference to org.sqlite.jni.Fts5PhraseIter.");
|
||||||
SJG.fts5.jPhraseIter.klazz = REF_G(klazz);
|
|
||||||
SJG.fts5.jPhraseIter.fidA = (*env)->GetFieldID(env, klazz, "a", "J");
|
SJG.fts5.jPhraseIter.fidA = (*env)->GetFieldID(env, klazz, "a", "J");
|
||||||
EXCEPTION_IS_FATAL("Cannot get Fts5PhraseIter.a field.");
|
EXCEPTION_IS_FATAL("Cannot get Fts5PhraseIter.a field.");
|
||||||
SJG.fts5.jPhraseIter.fidB = (*env)->GetFieldID(env, klazz, "a", "J");
|
SJG.fts5.jPhraseIter.fidB = (*env)->GetFieldID(env, klazz, "b", "J");
|
||||||
EXCEPTION_IS_FATAL("Cannot get Fts5PhraseIter.b field.");
|
EXCEPTION_IS_FATAL("Cannot get Fts5PhraseIter.b field.");
|
||||||
|
UNREF_L(klazz);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SJG.envCache.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST);
|
SJG.envCache.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST);
|
||||||
|
12
manifest
12
manifest
@ -1,5 +1,5 @@
|
|||||||
C Add\sa\snote\sto\sthe\sJNI\sREADME\sexplaining\swhy\sthe\sJava\sAPI\shas\scallback\snames\slike\sxFunc()\sand\sxPreUpdate().
|
C Remove\sunnecessary\sjclass-type\sstruct\smembers.
|
||||||
D 2023-08-23T13:36:27.524
|
D 2023-08-23T17:15:48.658
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||||
@ -235,7 +235,7 @@ F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a3
|
|||||||
F ext/jni/GNUmakefile 14b7c3abd1ae8693203b08b0e06bb359f8924ad2243f15953e9c6e456ae317b5
|
F ext/jni/GNUmakefile 14b7c3abd1ae8693203b08b0e06bb359f8924ad2243f15953e9c6e456ae317b5
|
||||||
F ext/jni/README.md 1693e865d366f5ebaa756732ea0d4b786515caf3cfbcd4dcb8758274373913b0
|
F ext/jni/README.md 1693e865d366f5ebaa756732ea0d4b786515caf3cfbcd4dcb8758274373913b0
|
||||||
F ext/jni/jar-dist.make 9a03d10dbb5a74c724bfec4b76fd9e4c9865cbbc858d731cb48f38ac897d73a3
|
F ext/jni/jar-dist.make 9a03d10dbb5a74c724bfec4b76fd9e4c9865cbbc858d731cb48f38ac897d73a3
|
||||||
F ext/jni/src/c/sqlite3-jni.c 852c4812c9a3663d871cb334eaa60eb6fc22d67da47d4ff3868fdbfd6ebedb3a
|
F ext/jni/src/c/sqlite3-jni.c adb773d104abe72e93364f21c52d455f361692f3cd7dd6d9fdab6110b8b4f3ee
|
||||||
F ext/jni/src/c/sqlite3-jni.h c5cb0348efe4e5f3d125a240e2437e8475de14a586c2f859e2acdcde4116244d
|
F ext/jni/src/c/sqlite3-jni.h c5cb0348efe4e5f3d125a240e2437e8475de14a586c2f859e2acdcde4116244d
|
||||||
F ext/jni/src/org/sqlite/jni/Authorizer.java 1308988f7f40579ea0e4deeaec3c6be971630566bd021c31367fe3f5140db892
|
F ext/jni/src/org/sqlite/jni/Authorizer.java 1308988f7f40579ea0e4deeaec3c6be971630566bd021c31367fe3f5140db892
|
||||||
F ext/jni/src/org/sqlite/jni/AutoExtension.java 3b62c915e45ce73f63343ca9195ec63592244d616a1908b7587bdd45de1b97dd
|
F ext/jni/src/org/sqlite/jni/AutoExtension.java 3b62c915e45ce73f63343ca9195ec63592244d616a1908b7587bdd45de1b97dd
|
||||||
@ -2094,8 +2094,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P d0c425b5c1d3aac5ead18a501a3760b4506d68d373cb3be484247042cf2fa8d4
|
P 415447a310f6a7d06b4aa9ef51f110cf8e2ef9545c69cb5983c367c50fe641d2
|
||||||
R 2838b81803960048740e7919bfbbb667
|
R fddefcd0dbe857a799e7e6b983a3459a
|
||||||
U stephan
|
U stephan
|
||||||
Z 6887128552106c38adfd2773e845a05f
|
Z b441a1d2bae36389c447acd3134d6be2
|
||||||
# Remove this line to create a well-formed Fossil manifest.
|
# Remove this line to create a well-formed Fossil manifest.
|
||||||
|
@ -1 +1 @@
|
|||||||
415447a310f6a7d06b4aa9ef51f110cf8e2ef9545c69cb5983c367c50fe641d2
|
d67255f7251cc5d1d27d77d4c84ff216e2da71202db989718189a6b4beff1cd0
|
Reference in New Issue
Block a user