aboutsummaryrefslogtreecommitdiff
path: root/ext/jni/src
diff options
context:
space:
mode:
Diffstat (limited to 'ext/jni/src')
-rw-r--r--ext/jni/src/c/sqlite3-jni.c22
-rw-r--r--ext/jni/src/org/sqlite/jni/AuthorizerCallback.java2
-rw-r--r--ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java2
-rw-r--r--ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java2
-rw-r--r--ext/jni/src/org/sqlite/jni/CallbackProxy.java (renamed from ext/jni/src/org/sqlite/jni/SQLite3CallbackProxy.java)2
-rw-r--r--ext/jni/src/org/sqlite/jni/CollationCallback.java2
-rw-r--r--ext/jni/src/org/sqlite/jni/CollationNeededCallback.java2
-rw-r--r--ext/jni/src/org/sqlite/jni/CommitHookCallback.java2
-rw-r--r--ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java2
-rw-r--r--ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java2
-rw-r--r--ext/jni/src/org/sqlite/jni/RollbackHookCallback.java2
-rw-r--r--ext/jni/src/org/sqlite/jni/Tester1.java28
-rw-r--r--ext/jni/src/org/sqlite/jni/TraceV2Callback.java2
-rw-r--r--ext/jni/src/org/sqlite/jni/UpdateHookCallback.java2
-rw-r--r--ext/jni/src/org/sqlite/jni/package-info.java7
15 files changed, 49 insertions, 32 deletions
diff --git a/ext/jni/src/c/sqlite3-jni.c b/ext/jni/src/c/sqlite3-jni.c
index bc1521225..8e654a1b2 100644
--- a/ext/jni/src/c/sqlite3-jni.c
+++ b/ext/jni/src/c/sqlite3-jni.c
@@ -266,6 +266,7 @@ static void * s3jni_realloc_or_die(JNIEnv * const env, void * p, size_t n){
#else
#define s3jni_oom_check(EXPR)
#endif
+//#define S3JniDb_oom(pDb,EXPR) ((EXPR) ? sqlite3OomFault(pDb) : 0)
/* Helpers for Java value reference management. */
static jobject s3jni_ref_global(JNIEnv * const env, jobject const v){
@@ -317,8 +318,8 @@ static const struct {
const S3JniNphRef OutputPointer_sqlite3;
const S3JniNphRef OutputPointer_sqlite3_stmt;
const S3JniNphRef OutputPointer_sqlite3_value;
-#ifdef SQLITE_ENABLE_FTS5
const S3JniNphRef OutputPointer_String;
+#ifdef SQLITE_ENABLE_FTS5
const S3JniNphRef OutputPointer_ByteArray;
const S3JniNphRef Fts5Context;
const S3JniNphRef Fts5ExtensionApi;
@@ -346,8 +347,8 @@ static const struct {
"Lorg/sqlite/jni/sqlite3_stmt;"),
RefO(9, "OutputPointer$sqlite3_value",
"Lorg/sqlite/jni/sqlite3_value;"),
-#ifdef SQLITE_ENABLE_FTS5
RefO(10, "OutputPointer$String", "Ljava/lang/String;"),
+#ifdef SQLITE_ENABLE_FTS5
RefO(11, "OutputPointer$ByteArray", "[B"),
RefN(12, "Fts5Context"),
RefN(13, "Fts5ExtensionApi"),
@@ -413,6 +414,10 @@ static const S3JniHook S3JniHook_empty = {0,0,0,0,0};
** Per-(sqlite3*) state for various JNI bindings. This state is
** allocated as needed, cleaned up in sqlite3_close(_v2)(), and
** recycled when possible.
+**
+** Trivia: vars and parameters of this type are often named "ps"
+** because this class used to have a name for which that abbreviation
+** made sense.
*/
typedef struct S3JniDb S3JniDb;
struct S3JniDb {
@@ -453,6 +458,10 @@ static const char * const S3JniDb_clientdata_key = "S3JniDb";
/*
** Cache for per-JNIEnv (i.e. per-thread) data.
+**
+** Trivia: vars and parameters of this type are often named "jc"
+** because this class used to have a name for which that abbreviation
+** made sense.
*/
typedef struct S3JniEnv S3JniEnv;
struct S3JniEnv {
@@ -1460,11 +1469,8 @@ static S3JniDb * S3JniDb_alloc(JNIEnv * const env, jobject jDb){
** from it, or no matching entry can be found.
*/
static S3JniDb * S3JniDb__from_java(JNIEnv * const env, jobject jDb){
- S3JniDb * s = 0;
- sqlite3 * pDb = 0;
- if( jDb ) pDb = PtrGet_sqlite3(jDb);
- s = S3JniDb_from_clientdata(pDb);
- return s;
+ sqlite3 * const pDb = jDb ? PtrGet_sqlite3(jDb) : 0;
+ return pDb ? S3JniDb_from_clientdata(pDb) : 0;
}
#define S3JniDb_from_java(jObject) S3JniDb__from_java(env,(jObject))
@@ -4259,7 +4265,7 @@ S3JniApi(sqlite3_trace_v2(),jint,1trace_1v2)(
rc = sqlite3_trace_v2(ps->pDb, (unsigned)traceMask, s3jni_trace_impl, ps);
if( 0==rc ){
S3JniHook_unref(&ps->hooks.trace);
- ps->hooks.trace = hook;
+ ps->hooks.trace = hook /* transfer ownership of reference */;
}else{
S3JniHook_unref(&hook);
}
diff --git a/ext/jni/src/org/sqlite/jni/AuthorizerCallback.java b/ext/jni/src/org/sqlite/jni/AuthorizerCallback.java
index a9f15fc6c..6dbd9cb77 100644
--- a/ext/jni/src/org/sqlite/jni/AuthorizerCallback.java
+++ b/ext/jni/src/org/sqlite/jni/AuthorizerCallback.java
@@ -17,7 +17,7 @@ import org.sqlite.jni.annotation.*;
/**
Callback for use with {@link SQLite3Jni#sqlite3_set_authorizer}.
*/
-public interface AuthorizerCallback extends SQLite3CallbackProxy {
+public interface AuthorizerCallback extends CallbackProxy {
/**
Must function as described for the C-level
sqlite3_set_authorizer() callback.
diff --git a/ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java b/ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java
index 1f8ace2fb..4a3694130 100644
--- a/ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java
+++ b/ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java
@@ -17,7 +17,7 @@ package org.sqlite.jni;
Callback for use with the {@link SQLite3Jni#sqlite3_auto_extension}
family of APIs.
*/
-public interface AutoExtensionCallback extends SQLite3CallbackProxy {
+public interface AutoExtensionCallback extends CallbackProxy {
/**
Must function as described for a C-level
sqlite3_auto_extension() callback.
diff --git a/ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java b/ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java
index db9295bb6..30a5edc03 100644
--- a/ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java
+++ b/ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java
@@ -16,7 +16,7 @@ package org.sqlite.jni;
/**
Callback for use with {@link SQLite3Jni#sqlite3_busy_handler}.
*/
-public interface BusyHandlerCallback extends SQLite3CallbackProxy {
+public interface BusyHandlerCallback extends CallbackProxy {
/**
Must function as documented for the C-level
sqlite3_busy_handler() callback argument, minus the (void*)
diff --git a/ext/jni/src/org/sqlite/jni/SQLite3CallbackProxy.java b/ext/jni/src/org/sqlite/jni/CallbackProxy.java
index 505266493..086c2f8e5 100644
--- a/ext/jni/src/org/sqlite/jni/SQLite3CallbackProxy.java
+++ b/ext/jni/src/org/sqlite/jni/CallbackProxy.java
@@ -41,4 +41,4 @@ package org.sqlite.jni;
<p>2) They all have a {@code call()} method but its signature is
callback-specific.
*/
-public interface SQLite3CallbackProxy {}
+public interface CallbackProxy {}
diff --git a/ext/jni/src/org/sqlite/jni/CollationCallback.java b/ext/jni/src/org/sqlite/jni/CollationCallback.java
index 481c6cd95..7f0e79a3f 100644
--- a/ext/jni/src/org/sqlite/jni/CollationCallback.java
+++ b/ext/jni/src/org/sqlite/jni/CollationCallback.java
@@ -20,7 +20,7 @@ import org.sqlite.jni.annotation.NotNull;
@see AbstractCollationCallback
*/
public interface CollationCallback
- extends SQLite3CallbackProxy, XDestroyCallback {
+ extends CallbackProxy, XDestroyCallback {
/**
Must compare the given byte arrays and return the result using
{@code memcmp()} semantics.
diff --git a/ext/jni/src/org/sqlite/jni/CollationNeededCallback.java b/ext/jni/src/org/sqlite/jni/CollationNeededCallback.java
index e6c917a2c..b72cf1ba5 100644
--- a/ext/jni/src/org/sqlite/jni/CollationNeededCallback.java
+++ b/ext/jni/src/org/sqlite/jni/CollationNeededCallback.java
@@ -16,7 +16,7 @@ package org.sqlite.jni;
/**
Callback for use with {@link SQLite3Jni#sqlite3_collation_needed}.
*/
-public interface CollationNeededCallback extends SQLite3CallbackProxy {
+public interface CollationNeededCallback extends CallbackProxy {
/**
Has the same semantics as the C-level sqlite3_create_collation()
callback.
diff --git a/ext/jni/src/org/sqlite/jni/CommitHookCallback.java b/ext/jni/src/org/sqlite/jni/CommitHookCallback.java
index 253d0b8cf..2e9a68d25 100644
--- a/ext/jni/src/org/sqlite/jni/CommitHookCallback.java
+++ b/ext/jni/src/org/sqlite/jni/CommitHookCallback.java
@@ -16,7 +16,7 @@ package org.sqlite.jni;
/**
Callback for use with {@link SQLite3Jni#sqlite3_commit_hook}.
*/
-public interface CommitHookCallback extends SQLite3CallbackProxy {
+public interface CommitHookCallback extends CallbackProxy {
/**
Works as documented for the C-level sqlite3_commit_hook()
callback. Must not throw.
diff --git a/ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java b/ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java
index b68dd4b6d..a60613932 100644
--- a/ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java
+++ b/ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java
@@ -16,7 +16,7 @@ package org.sqlite.jni;
/**
Callback for use with {@link SQLite3Jni#sqlite3_preupdate_hook}.
*/
-public interface PreupdateHookCallback extends SQLite3CallbackProxy {
+public interface PreupdateHookCallback extends CallbackProxy {
/**
Must function as described for the C-level sqlite3_preupdate_hook()
callback.
diff --git a/ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java b/ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java
index d15bf31a1..bc1537703 100644
--- a/ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java
+++ b/ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java
@@ -16,7 +16,7 @@ package org.sqlite.jni;
/**
Callback for use with {@link SQLite3Jni#sqlite3_progress_handler}.
*/
-public interface ProgressHandlerCallback extends SQLite3CallbackProxy {
+public interface ProgressHandlerCallback extends CallbackProxy {
/**
Works as documented for the C-level sqlite3_progress_handler() callback.
diff --git a/ext/jni/src/org/sqlite/jni/RollbackHookCallback.java b/ext/jni/src/org/sqlite/jni/RollbackHookCallback.java
index 3bf9f79a1..21600c805 100644
--- a/ext/jni/src/org/sqlite/jni/RollbackHookCallback.java
+++ b/ext/jni/src/org/sqlite/jni/RollbackHookCallback.java
@@ -16,7 +16,7 @@ package org.sqlite.jni;
/**
Callback for use with {@link SQLite3Jni#sqlite3_rollback_hook}.
*/
-public interface RollbackHookCallback extends SQLite3CallbackProxy {
+public interface RollbackHookCallback extends CallbackProxy {
/**
Works as documented for the C-level sqlite3_rollback_hook()
callback.
diff --git a/ext/jni/src/org/sqlite/jni/Tester1.java b/ext/jni/src/org/sqlite/jni/Tester1.java
index 4bd7e42ed..f47b5944a 100644
--- a/ext/jni/src/org/sqlite/jni/Tester1.java
+++ b/ext/jni/src/org/sqlite/jni/Tester1.java
@@ -74,9 +74,15 @@ public class Tester1 implements Runnable {
}
}
- public synchronized static void outln(Object val){
+ public synchronized static void outPrefix(){
if( !quietMode ){
System.out.print(Thread.currentThread().getName()+": ");
+ }
+ }
+
+ public synchronized static void outln(Object val){
+ if( !quietMode ){
+ outPrefix();
System.out.println(val);
}
}
@@ -90,7 +96,7 @@ public class Tester1 implements Runnable {
@SuppressWarnings("unchecked")
public synchronized static void out(Object... vals){
if( !quietMode ){
- System.out.print(Thread.currentThread().getName()+": ");
+ outPrefix();
for(Object v : vals) out(v);
}
}
@@ -429,7 +435,7 @@ public class Tester1 implements Runnable {
sqlite3 db = createNewDb();
execSql(db, "CREATE TABLE t(a)");
sqlite3_stmt stmt = prepare(db, "INSERT INTO t(a) VALUES(?);");
- String[] list1 = { "hell🤩", "w😃rld", "!" };
+ String[] list1 = { "hell🤩", "w😃rld", "!🤩" };
int rc;
int n = 0;
for( String e : list1 ){
@@ -450,14 +456,16 @@ public class Tester1 implements Runnable {
final String txt = sqlite3_column_text16(stmt, 0);
sbuf.append( txt );
affirm( txt.equals(sqlite3_column_text(stmt, 0)) );
+ affirm( txt.length() < sqlite3_value_bytes(sv) );
affirm( txt.equals(sqlite3_value_text(sv)) );
+ affirm( txt.length() == sqlite3_value_bytes16(sv)/2 );
affirm( txt.equals(sqlite3_value_text16(sv)) );
sqlite3_value_free(sv);
++n;
}
sqlite3_finalize(stmt);
affirm(3 == n);
- affirm("w😃rldhell🤩!".equals(sbuf.toString()));
+ affirm("w😃rldhell🤩!🤩".equals(sbuf.toString()));
sqlite3_close_v2(db);
}
@@ -1655,18 +1663,20 @@ public class Tester1 implements Runnable {
sqlite3_libversion_number(),"\n",
sqlite3_libversion(),"\n",SQLITE_SOURCE_ID,"\n",
"SQLITE_THREADSAFE=",SQLITE_THREADSAFE);
- outln("Running ",nRepeat," loop(s) with ",nThread," thread(s) each.");
+ final boolean showLoopCount = (nRepeat>1 && nThread>1);
+ if( showLoopCount ){
+ outln("Running ",nRepeat," loop(s) with ",nThread," thread(s) each.");
+ }
if( takeNaps ) outln("Napping between tests is enabled.");
for( int n = 0; n < nRepeat; ++n ){
++nLoop;
- out((1==nLoop ? "" : " ")+nLoop);
+ if( showLoopCount ) out((1==nLoop ? "" : " ")+nLoop);
if( nThread<=1 ){
new Tester1(0).runTests(false);
continue;
}
Tester1.mtMode = true;
final ExecutorService ex = Executors.newFixedThreadPool( nThread );
- //final List<Future<?>> futures = new ArrayList<>();
for( int i = 0; i < nThread; ++i ){
ex.submit( new Tester1(i), i );
}
@@ -1689,7 +1699,7 @@ public class Tester1 implements Runnable {
if( null!=err ) throw err;
}
}
- outln();
+ if( showLoopCount ) outln();
quietMode = false;
final long timeEnd = System.currentTimeMillis();
@@ -1706,7 +1716,7 @@ public class Tester1 implements Runnable {
final java.lang.reflect.Method[] declaredMethods =
SQLite3Jni.class.getDeclaredMethods();
for(java.lang.reflect.Method m : declaredMethods){
- int mod = m.getModifiers();
+ final int mod = m.getModifiers();
if( 0!=(mod & java.lang.reflect.Modifier.STATIC) ){
final String name = m.getName();
if(name.startsWith("sqlite3_")){
diff --git a/ext/jni/src/org/sqlite/jni/TraceV2Callback.java b/ext/jni/src/org/sqlite/jni/TraceV2Callback.java
index 897aeefa9..4e69bd875 100644
--- a/ext/jni/src/org/sqlite/jni/TraceV2Callback.java
+++ b/ext/jni/src/org/sqlite/jni/TraceV2Callback.java
@@ -17,7 +17,7 @@ import org.sqlite.jni.annotation.Nullable;
/**
Callback for use with {@link SQLite3Jni#sqlite3_trace_v2}.
*/
-public interface TraceV2Callback extends SQLite3CallbackProxy {
+public interface TraceV2Callback extends CallbackProxy {
/**
Called by sqlite3 for various tracing operations, as per
sqlite3_trace_v2(). Note that this interface elides the 2nd
diff --git a/ext/jni/src/org/sqlite/jni/UpdateHookCallback.java b/ext/jni/src/org/sqlite/jni/UpdateHookCallback.java
index 4fd0a6324..4d6afb887 100644
--- a/ext/jni/src/org/sqlite/jni/UpdateHookCallback.java
+++ b/ext/jni/src/org/sqlite/jni/UpdateHookCallback.java
@@ -16,7 +16,7 @@ package org.sqlite.jni;
/**
Callback for use with {@link SQLite3Jni#sqlite3_update_hook}.
*/
-public interface UpdateHookCallback extends SQLite3CallbackProxy {
+public interface UpdateHookCallback extends CallbackProxy {
/**
Must function as described for the C-level sqlite3_update_hook()
callback.
diff --git a/ext/jni/src/org/sqlite/jni/package-info.java b/ext/jni/src/org/sqlite/jni/package-info.java
index 21fdef27d..853d76fd7 100644
--- a/ext/jni/src/org/sqlite/jni/package-info.java
+++ b/ext/jni/src/org/sqlite/jni/package-info.java
@@ -12,9 +12,10 @@
as cross-language semantics allow for. A closely-related goal is
that <a href='https://sqlite.org/c3ref/intro.html'>the C
documentation</a> should be usable as-is, insofar as possible,
- for most of the JNI binding. As a rule, undocumented symbols
- behave as documented for their C API counterpart, and only
- semantic differences are documented here.</li>
+ for most of the JNI binding. As a rule, undocumented symbols in
+ the Java interface behave as documented for their C API
+ counterpart. Only semantic differences and Java-specific features
+ are documented here.</li>
<li>Support Java as far back as version 8 (2014).</li>