S3JniEnv * aHead /* Linked list of in-use instances */;
S3JniEnv * aFree /* Linked list of free instances */;
sqlite3_mutex * mutex /* mutex for aHead and aFree */;
- void const * locker /* env mutex is held on this object's behalf
- (used only for sanity checking). */;
+ void const * locker /* env mutex is held on this object's behalf.
+ Used only for sanity checking. */;
} envCache;
struct {
S3JniDb * aUsed /* Linked list of in-use instances */;
S3JniDb * aFree /* Linked list of free instances */;
sqlite3_mutex * mutex /* mutex for aUsed and aFree */;
- void const * locker /* perDb mutex is held on this object's
- behalf. Unlike envCache.locker, we
- cannot always have this set to the
- current JNIEnv object. */;
+ void const * locker /* perDb mutex is held on this object's
+ behalf. Unlike envCache.locker, we cannot
+ always have this set to the current JNIEnv
+ object. Used only for sanity checking. */;
} perDb;
/* Internal metrics. */
struct {
- unsigned envCacheHits;
- unsigned envCacheMisses;
- unsigned nMutexEnv /* number of times envCache.mutex was entered */;
- unsigned nMutexPerDb /* number of times perDb.mutex was entered */;
- unsigned nMutexAutoExt /* number of times autoExt.mutex was entered */;
- unsigned nDestroy /* xDestroy() calls across all types */;
+ volatile unsigned envCacheHits;
+ volatile unsigned envCacheMisses;
+ volatile unsigned nMutexEnv /* number of times envCache.mutex was entered */;
+ volatile unsigned nMutexPerDb /* number of times perDb.mutex was entered */;
+ volatile unsigned nMutexAutoExt /* number of times autoExt.mutex was entered */;
+ volatile unsigned nDestroy /* xDestroy() calls across all types */;
struct {
/* Number of calls for each type of UDF callback. */
- unsigned nFunc;
- unsigned nStep;
- unsigned nFinal;
- unsigned nValue;
- unsigned nInverse;
+ volatile unsigned nFunc;
+ volatile unsigned nStep;
+ volatile unsigned nFinal;
+ volatile unsigned nValue;
+ volatile unsigned nInverse;
} udf;
} metrics;
/**
affirm(v, "Affirmation failed.");
}
- private static void test1(){
- outln("libversion_number:",
- sqlite3_libversion_number(),"\n",
- sqlite3_libversion(),"\n",SQLITE_SOURCE_ID);
+ private void test1(){
+ if( 0==tId ){
+ outln("libversion_number:",
+ sqlite3_libversion_number(),"\n",
+ sqlite3_libversion(),"\n",SQLITE_SOURCE_ID);
+ }
affirm(sqlite3_libversion_number() == SQLITE_VERSION_NUMBER);
//outln("threadsafe = "+sqlite3_threadsafe());
affirm(SQLITE_MAX_LENGTH > 0);
return rv;
}
- private static void testCompileOption(){
+ private void testCompileOption(){
int i = 0;
String optName;
outln("compile options:");
}
- private static void testOpenDb1(){
+ private void testOpenDb1(){
final OutputPointer.sqlite3 out = new OutputPointer.sqlite3();
int rc = sqlite3_open(":memory:", out);
++metrics.dbOpen;
affirm(0 == db.getNativePointer());
}
- private static void testOpenDb2(){
+ private void testOpenDb2(){
final OutputPointer.sqlite3 out = new OutputPointer.sqlite3();
int rc = sqlite3_open_v2(":memory:", out,
SQLITE_OPEN_READWRITE
affirm(0 == db.getNativePointer());
}
- private static void testPrepare123(){
+ private void testPrepare123(){
sqlite3 db = createNewDb();
int rc;
final OutputPointer.sqlite3_stmt outStmt = new OutputPointer.sqlite3_stmt();
sqlite3_close_v2(db);
}
- private static void testBindFetchInt(){
+ private void testBindFetchInt(){
sqlite3 db = createNewDb();
execSql(db, "CREATE TABLE t(a)");
affirm(0 == db.getNativePointer());
}
- private static void testBindFetchInt64(){
+ private void testBindFetchInt64(){
sqlite3 db = createNewDb();
execSql(db, "CREATE TABLE t(a)");
sqlite3_stmt stmt = prepare(db, "INSERT INTO t(a) VALUES(?);");
sqlite3_close_v2(db);
}
- private static void testBindFetchDouble(){
+ private void testBindFetchDouble(){
sqlite3 db = createNewDb();
execSql(db, "CREATE TABLE t(a)");
sqlite3_stmt stmt = prepare(db, "INSERT INTO t(a) VALUES(?);");
sqlite3_close_v2(db);
}
- private static void testBindFetchText(){
+ private void testBindFetchText(){
sqlite3 db = createNewDb();
execSql(db, "CREATE TABLE t(a)");
sqlite3_stmt stmt = prepare(db, "INSERT INTO t(a) VALUES(?);");
sqlite3_close_v2(db);
}
- private static void testBindFetchBlob(){
+ private void testBindFetchBlob(){
sqlite3 db = createNewDb();
execSql(db, "CREATE TABLE t(a)");
sqlite3_stmt stmt = prepare(db, "INSERT INTO t(a) VALUES(?);");
sqlite3_close_v2(db);
}
- private static void testSql(){
+ private void testSql(){
sqlite3 db = createNewDb();
sqlite3_stmt stmt = prepare(db, "SELECT 1");
affirm( "SELECT 1".equals(sqlite3_sql(stmt)) );
sqlite3_finalize(stmt);
}
- private static void testCollation(){
+ private void testCollation(){
final sqlite3 db = createNewDb();
execSql(db, "CREATE TABLE t(a); INSERT INTO t(a) VALUES('a'),('b'),('c')");
final ValueHolder<Boolean> xDestroyCalled = new ValueHolder<>(false);
affirm(xDestroyCalled.value);
}
- private static void testToUtf8(){
+ private void testToUtf8(){
/**
Java docs seem contradictory, claiming to use "modified UTF-8"
encoding while also claiming to export using RFC 2279:
affirm( 5 == ba.length /* as opposed to 6 in modified utf-8 */);
}
- private static void testStatus(){
+ private void testStatus(){
final OutputPointer.Int64 cur64 = new OutputPointer.Int64();
final OutputPointer.Int64 high64 = new OutputPointer.Int64();
final OutputPointer.Int32 cur32 = new OutputPointer.Int32();
sqlite3_close_v2(db);
}
- private static void testUdf1(){
+ private void testUdf1(){
final sqlite3 db = createNewDb();
// These ValueHolders are just to confirm that the func did what we want...
final ValueHolder<Boolean> xDestroyCalled = new ValueHolder<>(false);
affirm( xDestroyCalled.value );
}
- private static void testUdfJavaObject(){
+ private void testUdfJavaObject(){
final sqlite3 db = createNewDb();
final ValueHolder<sqlite3> testResult = new ValueHolder<>(db);
final SQLFunction func = new SQLFunction.Scalar(){
sqlite3_close_v2(db);
}
- private static void testUdfAggregate(){
+ private void testUdfAggregate(){
final sqlite3 db = createNewDb();
final ValueHolder<Boolean> xFinalNull =
// To confirm that xFinal() is called with no aggregate state
sqlite3_close_v2(db);
}
- private static void testUdfWindow(){
+ private void testUdfWindow(){
final sqlite3 db = createNewDb();
/* Example window function, table, and results taken from:
https://sqlite.org/windowfunctions.html#udfwinfunc */
sqlite3_close_v2(db);
}
- private static void listBoundMethods(){
+ private void listBoundMethods(){
if(false){
final java.lang.reflect.Field[] declaredFields =
SQLite3Jni.class.getDeclaredFields();
outln(count+" functions named sqlite3_*.");
}
- private static void testTrace(){
+ private void testTrace(){
final sqlite3 db = createNewDb();
final ValueHolder<Integer> counter = new ValueHolder<>(0);
/* Ensure that characters outside of the UTF BMP survive the trip
affirm( 7 == counter.value );
}
- private static void testBusy(){
+ private void testBusy(){
final String dbName = "_busy-handler.db";
final OutputPointer.sqlite3 outDb = new OutputPointer.sqlite3();
final OutputPointer.sqlite3_stmt outStmt = new OutputPointer.sqlite3_stmt();
}
}
- private static void testProgress(){
+ private void testProgress(){
final sqlite3 db = createNewDb();
final ValueHolder<Integer> counter = new ValueHolder<>(0);
sqlite3_progress_handler(db, 1, new ProgressHandler(){
sqlite3_close_v2(db);
}
- private static void testCommitHook(){
+ private void testCommitHook(){
final sqlite3 db = createNewDb();
final ValueHolder<Integer> counter = new ValueHolder<>(0);
final ValueHolder<Integer> hookResult = new ValueHolder<>(0);
sqlite3_close_v2(db);
}
- private static void testUpdateHook(){
+ private void testUpdateHook(){
final sqlite3 db = createNewDb();
final ValueHolder<Integer> counter = new ValueHolder<>(0);
final ValueHolder<Integer> expectedOp = new ValueHolder<>(0);
sqlite3_close_v2(db);
}
- private static void testRollbackHook(){
+ private void testRollbackHook(){
final sqlite3 db = createNewDb();
final ValueHolder<Integer> counter = new ValueHolder<>(0);
final RollbackHook theHook = new RollbackHook(){
it throws.
*/
@SuppressWarnings("unchecked")
- private static void testFts5() throws Exception {
+ private void testFts5() throws Exception {
if( !SQLITE_ENABLE_FTS5 ){
outln("SQLITE_ENABLE_FTS5 is not set. Skipping FTS5 tests.");
return;
}
}
- private static void testAuthorizer(){
+ private void testAuthorizer(){
final sqlite3 db = createNewDb();
final ValueHolder<Integer> counter = new ValueHolder<>(0);
final ValueHolder<Integer> authRc = new ValueHolder<>(0);
sqlite3_close(db);
}
- private static void testAutoExtension(){
+ private void testAutoExtension(){
final ValueHolder<Integer> val = new ValueHolder<>(0);
final ValueHolder<String> toss = new ValueHolder<>(null);
final AutoExtension ax = new AutoExtension(){
affirm( 8 == val.value );
}
- private static void testSleep(){
+ private void testSleep(){
out("Sleeping briefly... ");
sqlite3_sleep(600);
outln("Woke up.");
}
}
}
- outln("\tSQLite3Jni sqlite3_*() methods: "+
+ outln("\tSQLite3Jni.sqlite3_*() methods: "+
nNatives+" native methods and "+
(nMethods - nNatives)+" Java impls");
outln("\tTotal test time = "
-C Add\smulti-thread\srun\smode\sto\sJNI\sTester1.\sIt\sworks\sbut\shangs\son\sexit\ssometimes\sfor\sJava\sreasons\sas\syet\snot\sunderstood.
-D 2023-08-19T10:43:05.945
+C Minor\sJNI\scleanups.
+D 2023-08-19T11:26:52.575
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8
F ext/jni/GNUmakefile 28ef565d7a2df7b8db61826a4db3806e24bfc25f0bfa2f56fdd5527c93ecdb10
F ext/jni/README.md 7a614a2fa6c561205f7a53fd8626cf93a7b5711ff454fc1814517f796df398eb
-F ext/jni/jar-dist.make f90a553203a57934bf275bed86479485135a52f48ac5c1cfe6499ae07b0b35a4
-F ext/jni/src/c/sqlite3-jni.c a4a762bff193e52a264778f64545674d5b58dbcb45478e9186d603fae2c312cd
+F ext/jni/jar-dist.make bb29ff5c369c95ffcd3687cacf35f7730fd33be2fe9b1ec31670fcd7d223980e
+F ext/jni/src/c/sqlite3-jni.c 8608cb36223d6bc64e8ddd9296b6d63a4fc54efaf8dbc3ea7e5eca81f4801d42
F ext/jni/src/c/sqlite3-jni.h f10d2f38720687c70ecdd5e44f6e8db98efee2caa05fc86b2d9e0c76e6cc0a18
F ext/jni/src/org/sqlite/jni/Authorizer.java 1308988f7f40579ea0e4deeaec3c6be971630566bd021c31367fe3f5140db892
F ext/jni/src/org/sqlite/jni/AutoExtension.java 18e83f6f463e306df60b2dceb65247d32af1f78af4bbbae9155411a8c6cdb093
F ext/jni/src/org/sqlite/jni/ProgressHandler.java 6f62053a828a572de809828b1ee495380677e87daa29a1c57a0e2c06b0a131dc
F ext/jni/src/org/sqlite/jni/ResultCode.java ba701f20213a5f259e94cfbfdd36eb7ac7ce7797f2c6c7fca2004ff12ce20f86
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/SQLFunction.java 8c1ad92c35bcc1b2f7256cf6e229b31340ed6d1a404d487f0a9adb28ba7fc332
F ext/jni/src/org/sqlite/jni/SQLite3Jni.java 26b3083501a9f42e9aa49b941f6b378213cf91ae1a8f705602773ed750043a3c
-F ext/jni/src/org/sqlite/jni/Tester1.java 655d7109a1079be898f2631930493bd86e0c0259582014bb7af41b87d21d9a27
+F ext/jni/src/org/sqlite/jni/Tester1.java 42341a1031fe6f1433b86a55718c38bd75b96105ef38b0c9ea88003ec637968c
F ext/jni/src/org/sqlite/jni/TesterFts5.java 3914b0a7ab0ff752c1082b1ae0c09b32827d81962fff62bcd0e13b9ec3a6f03f
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/fts5_extension_function.java ac825035d7d83fc7fd960347abfa6803e1614334a21533302041823ad5fc894c
F ext/jni/src/org/sqlite/jni/fts5_tokenizer.java e530b36e6437fcc500e95d5d75fbffe272bdea20d2fac6be2e1336c578fba98b
F ext/jni/src/org/sqlite/jni/sqlite3.java 62b1b81935ccf3393472d17cb883dc5ff39c388ec3bc1de547f098a0217158fc
-F ext/jni/src/org/sqlite/jni/sqlite3_context.java d26573fc7b309228cb49786e9078597d96232257defa955a3425d10897bca810
+F ext/jni/src/org/sqlite/jni/sqlite3_context.java fe7797a696978f057528a57b7a11e7797ed41fd7afcf100c5ebb67055d9f706f
F ext/jni/src/org/sqlite/jni/sqlite3_stmt.java 78e6d1b95ac600a9475e9db4623f69449322b0c93d1bd4e1616e76ed547ed9fc
F ext/jni/src/org/sqlite/jni/sqlite3_value.java 3d1d4903e267bc0bc81d57d21f5e85978eff389a1a6ed46726dbe75f85e6914a
-F ext/jni/src/org/sqlite/jni/tester/SQLTester.java 1f1286428fab38dfefe328e72b5735f533b19af8dd17712dd3df7e044d21c8b8
+F ext/jni/src/org/sqlite/jni/tester/SQLTester.java 2835eb3dd1e14767ca49354c224150c70300d8013d6d51dd875f7d9380faa278
F ext/jni/src/org/sqlite/jni/tester/test-script-interpreter.md f9f25126127045d051e918fe59004a1485311c50a13edbf18c79a6ff9160030e
F ext/jni/src/tests/000-000-sanity.test cfe6dc1b950751d6096e3f5695becaadcdaa048bfe9567209d6eb676e693366d
F ext/jni/src/tests/000-001-ignored.test e17e874c6ab3c437f1293d88093cf06286083b65bf162317f91bbfd92f961b70
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 2d955eef25ab116c487ebc34c6f2d2836d310af239ef1993f5aeee5a3f68d590
-R 8a1b71ae57321d848d8875e47d990d30
+P bdbaf7a4534f40e550b646979e67e7b7731566bb5a2631ed376ac85a9bec40a7
+R ff1ad0e885103241e4eaf57ec50ed798
U stephan
-Z 68dec3da5d321e77fd308ae3996624ba
+Z abc1dde430026808a827edd11bd0eed1
# Remove this line to create a well-formed Fossil manifest.