** OOM. pDb MUST, on success of the calling operation, subsequently be
** associated with jDb via NativePointerHolder_set().
*/
-static S3JniDb * S3JniDb_alloc(JNIEnv * const env, sqlite3 *pDb,
- jobject jDb){
+static S3JniDb * S3JniDb_alloc(JNIEnv * const env, jobject jDb){
S3JniDb * rv;
S3JniMutex_S3JniDb_enter;
if( SJG.perDb.aFree ){
rv->pNext->pPrev = rv;
}
rv->jDb = S3JniRefGlobal(jDb);
- rv->pDb = pDb;
}
S3JniMutex_S3JniDb_leave;
return rv;
return (jint)rc;
}
+S3JniApi(sqlite3_db_filename(),jstring,1db_1filename)(
+ JniArgsEnvClass, jobject jDb, jstring jDbName
+){
+ S3JniDb * const ps = S3JniDb_from_java(jDb);
+ char *zDbName;
+ jstring jRv = 0;
+ int nStr = 0;
+
+ if( !ps || !jDbName ){
+ return 0;
+ }
+ zDbName = s3jni_jstring_to_utf8(env, jDbName, &nStr);
+ if( zDbName ){
+ char const * zRv = sqlite3_db_filename(ps->pDb, zDbName);
+ sqlite3_free(zDbName);
+ if( zRv ){
+ jRv = s3jni_utf8_to_jstring(env, zRv, -1);
+ }
+ }
+ return jRv;
+}
+
+S3JniApi(sqlite3_db_handle(),jobject,1db_1handle)(
+ JniArgsEnvClass, jobject jpStmt
+){
+ sqlite3_stmt * const pStmt = PtrGet_sqlite3_stmt(jpStmt);
+ sqlite3 * const pDb = pStmt ? sqlite3_db_handle(pStmt) : 0;
+ S3JniDb * const ps = pDb ? S3JniDb_from_c(pDb) : 0;
+ return ps ? ps->jDb : 0;
+}
+
S3JniApi(sqlite3_db_config() /*for MAINDBNAME*/,
jint,1db_1config__Lorg_sqlite_jni_sqlite3_2ILjava_lang_String_2
)(JniArgsEnvClass, jobject jDb, jint op, jstring jStr){
);
}
-S3JniApi(sqlite3_db_filename(),jstring,1db_1filename)(
- JniArgsEnvClass, jobject jDb, jstring jDbName
-){
- S3JniDb * const ps = S3JniDb_from_java(jDb);
- char *zDbName;
- jstring jRv = 0;
- int nStr = 0;
-
- if( !ps || !jDbName ){
- return 0;
- }
- zDbName = s3jni_jstring_to_utf8(env, jDbName, &nStr);
- if( zDbName ){
- char const * zRv = sqlite3_db_filename(ps->pDb, zDbName);
- sqlite3_free(zDbName);
- if( zRv ){
- jRv = s3jni_utf8_to_jstring(env, zRv, -1);
- }
- }
- return jRv;
-}
-
-S3JniApi(sqlite3_db_handle(),jobject,1db_1handle)(
- JniArgsEnvClass, jobject jpStmt
-){
- sqlite3_stmt * const pStmt = PtrGet_sqlite3_stmt(jpStmt);
- sqlite3 * const pDb = pStmt ? sqlite3_db_handle(pStmt) : 0;
- S3JniDb * const ps = pDb ? S3JniDb_from_c(pDb) : 0;
- return ps ? ps->jDb : 0;
-}
-
S3JniApi(sqlite3_db_status(),jint,1db_1status)(
JniArgsEnvClass, jobject jDb, jint op, jobject jOutCurrent,
}
/*
-** Uncaches the current JNIEnv from the S3JniGlobal state, clearing any
-** resources owned by that cache entry and making that slot available
-** for re-use. It is important that the Java-side decl of this
-** function be declared as synchronous.
+** Uncaches the current JNIEnv from the S3JniGlobal state, clearing
+** any resources owned by that cache entry and making that slot
+** available for re-use.
*/
JniDecl(jboolean,1java_1uncache_1thread)(JniArgsEnvClass){
int rc;
return (jlong)sqlite3_last_insert_rowid(PtrGet_sqlite3(jpDb));
}
-/* Pre-open() code common to sqlite3_open(_v2)(). */
+/* Pre-open() code common to sqlite3_open[_v2](). */
static int s3jni_open_pre(JNIEnv * const env, S3JniEnv **jc,
jstring jDbName, char **zDbName,
S3JniDb ** ps){
rc = SQLITE_NOMEM;
goto end;
}
- *ps = S3JniDb_alloc(env, 0, jDb);
+ *ps = S3JniDb_alloc(env, jDb);
if( *ps ){
(*jc)->pdbOpening = *ps;
}else{
** else ps is associated with *ppDb. If *ppDb is not NULL then
** ps->jDb is stored in jOut (an OutputPointer.sqlite3 instance).
**
+** Must be called if s3jni_open_pre() succeeds and must not be called
+** if it doesn't.
+**
** Returns theRc.
*/
static int s3jni_open_post(JNIEnv * const env, S3JniEnv * const jc,
S3JniEnv * jc = 0;
char *zVfs = 0;
int rc = s3jni_open_pre(env, &jc, strName, &zName, &ps);
- if( 0==rc && strVfs ){
- zVfs = s3jni_jstring_to_utf8(env, strVfs, 0);
- if( !zVfs ){
- rc = SQLITE_NOMEM;
- }
- }
if( 0==rc ){
- rc = sqlite3_open_v2(zName, &pOut, (int)flags, zVfs);
+ if( strVfs ){
+ zVfs = s3jni_jstring_to_utf8(env, strVfs, 0);
+ if( !zVfs ){
+ rc = SQLITE_NOMEM;
+ }
+ }
+ if( 0==rc ){
+ rc = sqlite3_open_v2(zName, &pOut, (int)flags, zVfs);
+ }
+ rc = s3jni_open_post(env, jc, ps, &pOut, jOut, rc);
}
- rc = s3jni_open_post(env, jc, ps, &pOut, jOut, rc);
assert(rc==0 ? pOut!=0 : 1);
sqlite3_free(zName);
sqlite3_free(zVfs);
JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1data_1count
(JNIEnv *, jclass, jobject);
-/*
- * Class: org_sqlite_jni_SQLite3Jni
- * Method: sqlite3_db_filename
- * Signature: (Lorg/sqlite/jni/sqlite3;Ljava/lang/String;)Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1db_1filename
- (JNIEnv *, jclass, jobject, jstring);
-
-/*
- * Class: org_sqlite_jni_SQLite3Jni
- * Method: sqlite3_db_handle
- * Signature: (Lorg/sqlite/jni/sqlite3_stmt;)Lorg/sqlite/jni/sqlite3;
- */
-JNIEXPORT jobject JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1db_1handle
- (JNIEnv *, jclass, jobject);
-
/*
* Class: org_sqlite_jni_SQLite3Jni
* Method: sqlite3_db_config
JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1db_1config__Lorg_sqlite_jni_sqlite3_2ILjava_lang_String_2
(JNIEnv *, jclass, jobject, jint, jstring);
+/*
+ * Class: org_sqlite_jni_SQLite3Jni
+ * Method: sqlite3_db_filename
+ * Signature: (Lorg/sqlite/jni/sqlite3;Ljava/lang/String;)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1db_1filename
+ (JNIEnv *, jclass, jobject, jstring);
+
+/*
+ * Class: org_sqlite_jni_SQLite3Jni
+ * Method: sqlite3_db_handle
+ * Signature: (Lorg/sqlite/jni/sqlite3_stmt;)Lorg/sqlite/jni/sqlite3;
+ */
+JNIEXPORT jobject JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1db_1handle
+ (JNIEnv *, jclass, jobject);
+
/*
* Class: org_sqlite_jni_SQLite3Jni
* Method: sqlite3_db_status
-C Two\ssignificant\stypo\sfixes\sfor\s[1a30919bfbb686].
-D 2023-08-26T17:36:15.621
+C Re-order\ssome\sout-of-order\sJNI\sAPIs.\sCorrect\sJNI\ssqlite3_open_v2()\sbehavior\sin\sa\sparticular\sOOM\scondition.
+D 2023-08-26T18:01:36.744
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
F ext/jni/GNUmakefile d9244b5addf58868343a74a94faa71f829e7f40c163486d053f4b4bbea173703
F ext/jni/README.md 1332b1fa27918bd5d9ca2d0d4f3ac3a6ab86b9e3699dc5bfe32904a027f3d2a9
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
-F ext/jni/src/c/sqlite3-jni.c 96d9681396fef07c83372ce949359bf069e04cd648279760b3bd65352a3cf889
-F ext/jni/src/c/sqlite3-jni.h a4559d325925ca4d55ca75e2054adff607fdd35c2a94fecc9f2e8f919cababed
+F ext/jni/src/c/sqlite3-jni.c 2bbd0443b336a9c4d4cfea37a254592c96cf95f18f5aad0c60ff45968311bb61
+F ext/jni/src/c/sqlite3-jni.h 22c6c760a31ebfc3fe13d45d2a3a4dd7c8f9c6207aeba3fdc38137452cbf3a04
F ext/jni/src/org/sqlite/jni/AggregateFunction.java e0aac6ccae05702f8ee779820570866a2760aaa57a73135c57c8d3580bef52d5
F ext/jni/src/org/sqlite/jni/AuthorizerCallback.java c374bb76409cce7a0bdba94877706b59ac6127fa5d9e6af3e8058c99ce99c030
F ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java 4290d8b0937b07d466b50e6ca4136cec037f3ce658277af0d0c2d371e5f4b459
F ext/jni/src/org/sqlite/jni/RollbackHookCallback.java be7f7a26d1102fb514d835e11198d51302af8053d97188bfb2e34c2133208568
F ext/jni/src/org/sqlite/jni/SQLFunction.java d060f302b2cc4cf7a4f5a6b2d36458a2e6fc9648374b5d09c36a43665af41207
F ext/jni/src/org/sqlite/jni/SQLite3CallbackProxy.java 13c4ea6f35871261eba63fa4117715515e0beecbdebfb879ec5b1f340ed36904
-F ext/jni/src/org/sqlite/jni/SQLite3Jni.java 9368994e8da4f8012466e4314f484818b8247c7417904fb04ffc87142c87aed5
+F ext/jni/src/org/sqlite/jni/SQLite3Jni.java 663600b216653850bfe4e2c00cfc8da12db94b3f36c4b79f6a7d1bde6ad0b484
F ext/jni/src/org/sqlite/jni/ScalarFunction.java 21301a947e49f0dd9c682dfe2cc8a6518226c837253dd791cd512f847eeca52c
F ext/jni/src/org/sqlite/jni/Tester1.java 37b46dc15ac8fbeb916dcf1f7771023d2be025d05422d725d5891935eda506ac
F ext/jni/src/org/sqlite/jni/TesterFts5.java 6f135c60e24c89e8eecb9fe61dde0f3bb2906de668ca6c9186bcf34bdaf94629
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 1a30919bfbb686464e8020e684120d22dd2375b910a17446b75452fda96a7449
-R daab7741306924c5da59534b151007f9
+P 6a6ee6dd54ec1a1dc7fb7d2f331951525d394a8362aef911f62878ac3961898f
+R 802391c6b76d7ea843bfc8720b7feccc
U stephan
-Z 2446667f02ee59a9738709662543977d
+Z 04c34431ca2b1ac34ae8b832852ca4c0
# Remove this line to create a well-formed Fossil manifest.