1
0
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:
stephan
2023-08-23 17:15:48 +00:00
parent 495046ef88
commit 1c3bf8a3e1
3 changed files with 65 additions and 66 deletions

View File

@ -356,7 +356,7 @@ struct S3JniNphClass {
** NativePointerHolder subclass represented by
** zClassName */;
volatile jmethodID midCtor /* klazz's no-arg constructor. Used by
** new_NativePointerHolder_object(). */;
** new_NativePointerHolder_object(). */;
volatile jfieldID fidValue /* NativePointerHolder.nativePointer or
** OutputPointer.T.value */;
volatile jfieldID fidAggCtx /* sqlite3_context::aggregateContext. Used only
@ -369,12 +369,6 @@ struct S3JniHook{
jobject jObj /* global ref to Java instance */;
jmethodID midCallback /* callback method. Signature depends on
** 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
Fts5ExtensionApi instance. */;
struct {
volatile jclass klazz /* Global ref to the Fts5Phrase iter class */;
jfieldID fidA /* Fts5Phrase::a member */;
jfieldID fidB /* Fts5Phrase::b member */;
} jPhraseIter;
@ -860,6 +853,7 @@ static char * s3jni_exception_error_msg(JNIEnv * const env, jthrowable jx ){
char * zMsg;
jclass const klazz = (*env)->GetObjectClass(env, jx);
mid = (*env)->GetMethodID(env, klazz, "toString", "()Ljava/lang/String;");
UNREF_L(klazz);
IFTHREW{
EXCEPTION_REPORT;
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
** applies it to jobj. If jObj is NULL, this is a no-op. If klazz is
** NULL then it's derived from jobj. The lack of an xDestroy() method
** is silently ignored and any exceptions thrown by xDestroy() trigger
** a warning to stdout or stderr and then the exception is suppressed.
** Extracts the (void xDestroy()) method from jObj and applies it to
** jObj. If jObj is NULL, this is a no-op. The lack of an xDestroy()
** method is silently ignored and any exceptions thrown by xDestroy()
** trigger a warning to stdout or stderr and then the exception is
** 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){
jmethodID method;
if(!klazz){
klazz = (*env)->GetObjectClass(env, jObj);
assert(klazz);
}
method = (*env)->GetMethodID(env, klazz, "xDestroy", "()V");
jclass const klazz = (*env)->GetObjectClass(env, jObj);
jmethodID method = (*env)->GetMethodID(env, klazz, "xDestroy", "()V");
UNREF_L(klazz);
if(method){
s3jni_incr( &SJG.metrics.nDestroy );
(*env)->CallVoidMethod(env, jObj, method);
@ -927,6 +919,7 @@ static void s3jni_call_xDestroy(JNIEnv * const env, jobject jObj, jclass klazz){
EXCEPTION_CLEAR;
}
}else{
/* Non-fatal. */
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
** 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
** cleared. It is legal to call this when the object has no Java
** references.
*/
static void S3JniHook_unref(JNIEnv * const env, S3JniHook * const s, int doXDestroy){
if(doXDestroy && s->klazz && s->jObj){
s3jni_call_xDestroy(env, s->jObj, s->klazz);
if(doXDestroy && s->jObj){
s3jni_call_xDestroy(env, s->jObj);
}
UNREF_G(s->jObj);
UNREF_G(s->klazz);
memset(s, 0, sizeof(*s));
}
@ -1198,16 +1190,12 @@ static void S3JniAutoExtension_clear(JNIEnv * const env,
static int S3JniAutoExtension_init(JNIEnv *const env,
S3JniAutoExtension * const ax,
jobject const jAutoExt){
jclass klazz;
klazz = (*env)->GetObjectClass(env, jAutoExt);
if(!klazz){
S3JniAutoExtension_clear(env, ax);
return SQLITE_ERROR;
}
jclass const klazz = (*env)->GetObjectClass(env, jAutoExt);
ax->midFunc = (*env)->GetMethodID(env, klazz, "xEntryPoint",
"(Lorg/sqlite/jni/sqlite3;)I");
EXCEPTION_WARN_IGNORE;
UNREF_L(klazz);
EXCEPTION_WARN_IGNORE;
if(!ax->midFunc){
MARKER(("Error getting xEntryPoint(sqlite3) from AutoExtension object."));
S3JniAutoExtension_clear(env, ax);
@ -1245,8 +1233,7 @@ static int udf_setAggregateContext(JNIEnv * env, jobject jCx,
if(!pNC->fidAggCtx){
MUTEX_NPH_ENTER;
if(!pNC->fidAggCtx){
pNC->fidAggCtx = (*env)->GetFieldID(env, pNC->klazz,
"aggregateContext", "J");
pNC->fidAggCtx = (*env)->GetFieldID(env, pNC->klazz, "aggregateContext", "J");
EXCEPTION_IS_FATAL("Cannot get sqlite3_contex.aggregateContext member.");
}
MUTEX_NPH_LEAVE;
@ -1540,7 +1527,6 @@ typedef void (*udf_xFinal_f)(sqlite3_context*);
typedef struct S3JniUdf S3JniUdf;
struct S3JniUdf {
jobject jObj /* SQLFunction instance */;
jclass klazz /* jObj's class */;
char * zFuncName /* Only for error reporting and debug logging */;
enum UDFType type;
/** 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";
const char * zFV = /* signature for xFinal, xValue */
"(Lorg/sqlite/jni/sqlite3_context;)V";
jclass const klazz = (*env)->GetObjectClass(env, jObj);
memset(s, 0, sizeof(S3JniUdf));
s->jObj = REF_G(jObj);
s->klazz = REF_G((*env)->GetObjectClass(env, jObj));
#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)
FGET("xFunc", zFSI, jmidxFunc);
FGET("xStep", zFSI, jmidxStep);
@ -1570,6 +1557,7 @@ static S3JniUdf * S3JniUdf_alloc(JNIEnv * const env, jobject jObj){
FGET("xValue", zFV, jmidxValue);
FGET("xInverse", zFSI, jmidxInverse);
#undef FGET
UNREF_L(klazz);
if(s->jmidxFunc) s->type = UDF_SCALAR;
else if(s->jmidxStep && s->jmidxFinal){
s->type = s->jmidxValue ? UDF_WINDOW : UDF_AGGREGATE;
@ -1584,9 +1572,8 @@ static void S3JniUdf_free(S3JniUdf * s){
LocalJniGetEnv;
if(env){
//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->klazz);
}
sqlite3_free(s->zFuncName);
sqlite3_free(s);
@ -2024,10 +2011,12 @@ JDECL(jint,1busy_1handler)(JENV_CSELF, jobject jDb, jobject jBusy){
/* Same object - this is a no-op. */
return 0;
}
jclass klazz;
S3JniHook_unref(env, pHook, 1);
pHook->jObj = REF_G(jBusy);
pHook->klazz = REF_G((*env)->GetObjectClass(env, jBusy));
pHook->midCallback = (*env)->GetMethodID(env, pHook->klazz, "xCallback", "(I)I");
klazz = (*env)->GetObjectClass(env, jBusy);
pHook->midCallback = (*env)->GetMethodID(env, klazz, "xCallback", "(I)I");
UNREF_L(klazz);
IFTHREW {
S3JniHook_unref(env, pHook, 0);
rc = SQLITE_ERROR;
@ -2157,6 +2146,7 @@ JDECL(jint,1collation_1needed)(JENV_CSELF, jobject jDb, jobject jHook){
klazz = (*env)->GetObjectClass(env, jHook);
xCallback = (*env)->GetMethodID(env, klazz, "xCollationNeeded",
"(Lorg/sqlite/jni/sqlite3;ILjava/lang/String;)I");
UNREF_L(klazz);
IFTHREW {
rc = s3jni_db_exception(env, ps, SQLITE_MISUSE,
"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,
isCommit ? "xCommitHook" : "xRollbackHook",
isCommit ? "()I" : "()V");
UNREF_L(klazz);
IFTHREW {
EXCEPTION_REPORT;
EXCEPTION_CLEAR;
@ -2371,6 +2362,7 @@ JDECL(jint,1config__Lorg_sqlite_jni_SQLLog_2)(JENV_CSELF, jobject jLog){
S3JniHook tmpHook;
S3JniHook * const hook = &tmpHook;
S3JniHook * const hookOld = & SJG.hooks.sqllog;
jclass klazz;
int rc = 0;
if( !jLog ){
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) ){
return 0;
}
hook->klazz = REF_G( (*env)->GetObjectClass(env, jLog) );
hook->midCallback = (*env)->GetMethodID(env, hook->klazz, "xSqllog",
klazz = (*env)->GetObjectClass(env, jLog);
hook->midCallback = (*env)->GetMethodID(env, klazz, "xSqllog",
"(Lorg/sqlite/jni/sqlite3;"
"Ljava/lang/String;"
"I)V");
UNREF_L(klazz);
if( !hook->midCallback ){
EXCEPTION_WARN_IGNORE;
S3JniHook_unref(env, hook, 0);
@ -2423,8 +2416,9 @@ JDECL(jint,1create_1collation)(JENV_CSELF, jobject jDb,
klazz = (*env)->GetObjectClass(env, oCollation);
pHook->midCallback = (*env)->GetMethodID(env, klazz, "xCompare",
"([B[B)I");
UNREF_L(klazz);
IFTHREW{
EXCEPTION_REPORT;
UNREF_L(klazz);
return s3jni_db_error(ps->pDb, SQLITE_ERROR,
"Could not get xCompare() method for object.");
}
@ -2435,7 +2429,6 @@ JDECL(jint,1create_1collation)(JENV_CSELF, jobject jDb,
JSTR_RELEASE(name, zName);
if( 0==rc ){
pHook->jObj = REF_G(oCollation);
pHook->klazz = REF_G(klazz);
}else{
S3JniHook_unref(env, pHook, 1);
}
@ -3000,6 +2993,7 @@ static jobject s3jni_updatepre_hook(JNIEnv * env, int isPre, jobject jDb, jobjec
"JJ)V")
: (*env)->GetMethodID(env, klazz, "xUpdateHook",
"(ILjava/lang/String;Ljava/lang/String;J)V");
UNREF_L(klazz);
IFTHREW {
EXCEPTION_CLEAR;
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);
xCallback = (*env)->GetMethodID(env, klazz, "xCallback", "()I");
UNREF_L(klazz);
IFTHREW {
EXCEPTION_CLEAR;
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 );
}else{
int rc = 0;
jclass klazz;
if( pHook->jObj ){
if( (*env)->IsSameObject(env, pHook->jObj, jHook) ){
/* 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);
}
pHook->jObj = REF_G(jHook);
pHook->klazz = REF_G((*env)->GetObjectClass(env, jHook));
pHook->midCallback = (*env)->GetMethodID(env, pHook->klazz,
klazz = (*env)->GetObjectClass(env, jHook);
pHook->midCallback = (*env)->GetMethodID(env, klazz,
"xAuth",
"(I"
"Ljava/lang/String;"
@ -3368,6 +3364,7 @@ JDECL(jint,1set_1authorizer)(JENV_CSELF,jobject jDb, jobject jHook){
"Ljava/lang/String;"
"Ljava/lang/String;"
")I");
UNREF_L(klazz);
IFTHREW {
S3JniHook_unref(env, pHook, 0);
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);
ps->hooks.trace.midCallback = (*env)->GetMethodID(env, klazz, "xCallback",
"(ILjava/lang/Object;Ljava/lang/Object;)I");
UNREF_L(klazz);
IFTHREW {
EXCEPTION_CLEAR;
return s3jni_db_error(ps->pDb, SQLITE_ERROR,
@ -3723,7 +3721,6 @@ JDECL(void,1do_1something_1for_1developer)(JENV_CSELF){
*/
typedef struct {
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
@ -3737,9 +3734,8 @@ static void Fts5JniAux_free(Fts5JniAux * const s){
LocalJniGetEnv;
if(env){
/*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->klazz);
UNREF_G(s->jUserData);
}
sqlite3_free(s->zFuncName);
@ -3753,14 +3749,16 @@ static void Fts5JniAux_xDestroy(void *p){
static Fts5JniAux * Fts5JniAux_alloc(JNIEnv * const env, jobject jObj){
Fts5JniAux * s = sqlite3_malloc(sizeof(Fts5JniAux));
if(s){
jclass klazz;
memset(s, 0, sizeof(Fts5JniAux));
s->jObj = REF_G(jObj);
s->klazz = REF_G((*env)->GetObjectClass(env, jObj));
s->jmid = (*env)->GetMethodID(env, s->klazz, "xFunction",
klazz = (*env)->GetObjectClass(env, jObj);
s->jmid = (*env)->GetMethodID(env, klazz, "xFunction",
"(Lorg/sqlite/jni/Fts5ExtensionApi;"
"Lorg/sqlite/jni/Fts5Context;"
"Lorg/sqlite/jni/sqlite3_context;"
"[Lorg/sqlite/jni/sqlite3_value;)V");
UNREF_L(klazz);
IFTHREW{
EXCEPTION_REPORT;
EXCEPTION_CLEAR;
@ -3966,7 +3964,7 @@ static void S3JniFts5AuxData_xDestroy(void *x){
S3JniFts5AuxData * const p = x;
if(p->jObj){
LocalJniGetEnv;
s3jni_call_xDestroy(env, p->jObj, 0);
s3jni_call_xDestroy(env, p->jObj);
UNREF_G(p->jObj);
}
sqlite3_free(x);
@ -4023,7 +4021,7 @@ static void s3jni_phraseIter_NToJ(JNIEnv *const env,
Fts5PhraseIter const * const pSrc,
jobject jIter){
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);
EXCEPTION_IS_FATAL("Cannot set Fts5PhraseIter.a field.");
(*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,
Fts5PhraseIter * const pDest){
S3JniGlobalType * const g = &S3JniGlobal;
assert(g->fts5.jPhraseIter.klazz);
assert(g->fts5.jPhraseIter.fidA);
pDest->a =
(const unsigned char *)(*env)->GetLongField(env, jIter, g->fts5.jPhraseIter.fidA);
EXCEPTION_IS_FATAL("Cannot get Fts5PhraseIter.a field.");
@ -4078,7 +4076,6 @@ JDECLFtsXA(void,xPhraseNext)(JENV_OSELF,jobject jCtx, jobject jIter,
Fts5ExtDecl;
Fts5PhraseIter iter;
int iCol = 0, iOff = 0;
if(!SJG.fts5.jPhraseIter.klazz) return /*SQLITE_MISUSE*/;
s3jni_phraseIter_JToN(env, jIter, &iter);
fext->xPhraseNext(PtrGet_Fts5Context(jCtx), &iter, &iCol, &iOff);
OutputPointer_set_Int32(env, jOutCol, iCol);
@ -4091,7 +4088,6 @@ JDECLFtsXA(void,xPhraseNextColumn)(JENV_OSELF,jobject jCtx, jobject jIter,
Fts5ExtDecl;
Fts5PhraseIter iter;
int iCol = 0;
if(!SJG.fts5.jPhraseIter.klazz) return /*SQLITE_MISUSE*/;
s3jni_phraseIter_JToN(env, jIter, &iter);
fext->xPhraseNextColumn(PtrGet_Fts5Context(jCtx), &iter, &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",
"(Lorg.sqlite.jni.Fts5ExtensionApi;"
"Lorg.sqlite.jni.Fts5Context;)I");
UNREF_L(klazz);
EXCEPTION_IS_FATAL("Could not extract xQueryPhraseCallback.xCallback method.");
return (jint)fext->xQueryPhrase(PtrGet_Fts5Context(jFcx), iPhrase, &s,
s3jni_xQueryPhrase);
@ -4179,7 +4176,7 @@ JDECLFtsXA(int,xSetAuxdata)(JENV_OSELF,jobject jCtx, jobject jAux){
if(jAux){
/* Emulate how xSetAuxdata() behaves when it cannot alloc
** its auxdata wrapper. */
s3jni_call_xDestroy(env, jAux, 0);
s3jni_call_xDestroy(env, jAux);
}
return SQLITE_NOMEM;
}
@ -4237,6 +4234,7 @@ static jint s3jni_fts5_xTokenize(JENV_OSELF, S3NphRef const *pRef,
s.jFcx = jFcx;
s.fext = fext;
s.midCallback = (*env)->GetMethodID(env, klazz, "xToken", "(I[BII)I");
UNREF_L(klazz);
IFTHREW {
EXCEPTION_REPORT;
EXCEPTION_CLEAR;
@ -4606,16 +4604,17 @@ Java_org_sqlite_jni_SQLite3Jni_init(JENV_CSELF){
SJG.g.oCharsetUtf8 =
REF_G((*env)->GetStaticObjectField(env, klazz, fUtf8));
EXCEPTION_IS_FATAL("Error getting reference to StandardCharsets.UTF_8.");
UNREF_L(klazz);
}
#ifdef SQLITE_ENABLE_FTS5
klazz = (*env)->FindClass(env, "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");
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.");
UNREF_L(klazz);
#endif
SJG.envCache.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST);

View File

@ -1,5 +1,5 @@
C Add\sa\snote\sto\sthe\sJNI\sREADME\sexplaining\swhy\sthe\sJava\sAPI\shas\scallback\snames\slike\sxFunc()\sand\sxPreUpdate().
D 2023-08-23T13:36:27.524
C Remove\sunnecessary\sjclass-type\sstruct\smembers.
D 2023-08-23T17:15:48.658
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@ -235,7 +235,7 @@ F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a3
F ext/jni/GNUmakefile 14b7c3abd1ae8693203b08b0e06bb359f8924ad2243f15953e9c6e456ae317b5
F ext/jni/README.md 1693e865d366f5ebaa756732ea0d4b786515caf3cfbcd4dcb8758274373913b0
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/org/sqlite/jni/Authorizer.java 1308988f7f40579ea0e4deeaec3c6be971630566bd021c31367fe3f5140db892
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.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P d0c425b5c1d3aac5ead18a501a3760b4506d68d373cb3be484247042cf2fa8d4
R 2838b81803960048740e7919bfbbb667
P 415447a310f6a7d06b4aa9ef51f110cf8e2ef9545c69cb5983c367c50fe641d2
R fddefcd0dbe857a799e7e6b983a3459a
U stephan
Z 6887128552106c38adfd2773e845a05f
Z b441a1d2bae36389c447acd3134d6be2
# Remove this line to create a well-formed Fossil manifest.

View File

@ -1 +1 @@
415447a310f6a7d06b4aa9ef51f110cf8e2ef9545c69cb5983c367c50fe641d2
d67255f7251cc5d1d27d77d4c84ff216e2da71202db989718189a6b4beff1cd0