diff --git a/ext/jni/GNUmakefile b/ext/jni/GNUmakefile index fe53f36a03..02998569a2 100644 --- a/ext/jni/GNUmakefile +++ b/ext/jni/GNUmakefile @@ -31,6 +31,13 @@ mkdir := mkdir -p $(dir.bld.c): $(mkdir) $@ +javac.flags ?= -Xlint:unchecked -Xlint:deprecation +java.flags ?= +jnicheck ?= 1 +ifeq (1,$(jnicheck)) + java.flags += -Xcheck:jni +endif + classpath := $(dir.src) CLEAN_FILES := $(package.jar) DISTCLEAN_FILES := $(dir.jni)/*~ $(dir.src.c)/*~ $(dir.src.jni)/*~ @@ -47,7 +54,7 @@ SQLTester.class := $(SQLTester.java:.java=.class) # It would be a real doozy to bind to JNI. enable.fts5 ?= 1 # If enable.tester is 0, the org/sqlite/jni/tester/* bits are elided. -enable.tester ?= 1 +enable.tester ?= $(if $(wildcard $(dir.src.jni.tester)/SQLTester.java),1,0) # bin.version-info = binary to output various sqlite3 version info # building the distribution zip file. @@ -62,7 +69,6 @@ JAVA_FILES.main := $(patsubst %,$(dir.src.jni)/%,\ annotation/Canonical.java \ annotation/NotNull.java \ annotation/Nullable.java \ - annotation/package-info.java \ AbstractCollationCallback.java \ AggregateFunction.java \ AuthorizerCallback.java \ @@ -80,20 +86,22 @@ JAVA_FILES.main := $(patsubst %,$(dir.src.jni)/%,\ RollbackHookCallback.java \ ScalarFunction.java \ SQLFunction.java \ + CallbackProxy.java \ SQLite3Jni.java \ TableColumnMetadata.java \ - Tester1.java \ TraceV2Callback.java \ UpdateHookCallback.java \ ValueHolder.java \ WindowFunction.java \ XDestroyCallback.java \ - package-info.java \ sqlite3.java \ sqlite3_context.java \ sqlite3_stmt.java \ sqlite3_value.java \ ) +JAVA_FILES.unittest := $(patsubst %,$(dir.src.jni)/%,\ + Tester1.java \ +) ifeq (1,$(enable.fts5)) JAVA_FILES.main += $(patsubst %,$(dir.src.jni)/%,\ fts5_api.java \ @@ -109,32 +117,30 @@ ifeq (1,$(enable.fts5)) ) endif JAVA_FILES.tester := $(dir.src.jni.tester)/SQLTester.java +JAVA_FILES.package.info := \ + $(dir.src.jni)/package-info.java \ + $(dir.src.jni)/annotation/package-info.java CLASS_FILES.main := $(JAVA_FILES.main:.java=.class) +CLASS_FILES.unittest := $(JAVA_FILES.unittest:.java=.class) CLASS_FILES.tester := $(JAVA_FILES.tester:.java=.class) -JAVA_FILES += $(JAVA_FILES.main) +JAVA_FILES += $(JAVA_FILES.main) $(JAVA_FILES.unittest) ifeq (1,$(enable.tester)) JAVA_FILES += $(JAVA_FILES.tester) endif CLASS_FILES := -define DOTCLASS_DEPS -$(1).class: $(1).java $(MAKEFILE) +define CLASSFILE_DEPS all: $(1).class CLASS_FILES += $(1).class endef -$(foreach B,$(basename $(JAVA_FILES)),$(eval $(call DOTCLASS_DEPS,$(B)))) -$(CLASS_FILES.tester): $(CLASS_FILES.main) -javac.flags ?= -Xlint:unchecked -Xlint:deprecation -java.flags ?= -jnicheck ?= 1 -ifeq (1,$(jnicheck)) - java.flags += -Xcheck:jni -endif -$(SQLite3Jni.class): $(JAVA_FILES) +$(foreach B,$(basename \ + $(JAVA_FILES.main) $(JAVA_FILES.unittest) $(JAVA_FILES.tester)),\ + $(eval $(call CLASSFILE_DEPS,$(B)))) +$(CLASS_FILES): $(JAVA_FILES) $(MAKEFILE) $(bin.javac) $(javac.flags) -h $(dir.bld.c) -cp $(classpath) $(JAVA_FILES) -all: $(SQLite3Jni.class) + #.PHONY: classfiles ######################################################################## @@ -199,13 +205,18 @@ endif sqlite3-jni.c := $(dir.src.c)/sqlite3-jni.c sqlite3-jni.o := $(dir.bld.c)/sqlite3-jni.o sqlite3-jni.h := $(dir.src.c)/sqlite3-jni.h -sqlite3-jni.dll := $(dir.bld.c)/libsqlite3-jni.so +package.dll := $(dir.bld.c)/libsqlite3-jni.so # All javac-generated .h files must be listed in $(sqlite3-jni.h.in): sqlite3-jni.h.in := +# $(java.with.jni) lists all Java files which contain JNI decls: +java.with.jni := define ADD_JNI_H sqlite3-jni.h.in += $$(dir.bld.c)/org_sqlite_jni_$(1).h +java.with.jni += $$(dir.src.jni)/$(1).java $$(dir.bld.c)/org_sqlite_jni_$(1).h: $$(dir.src.jni)/$(1).java endef +# Invoke ADD_JNI_H once for each Java file which includes JNI +# declarations: $(eval $(call ADD_JNI_H,SQLite3Jni)) ifeq (1,$(enable.fts5)) $(eval $(call ADD_JNI_H,Fts5ExtensionApi)) @@ -216,8 +227,10 @@ ifeq (1,$(enable.tester)) sqlite3-jni.h.in += $(dir.bld.c)/org_sqlite_jni_tester_SQLTester.h $(dir.bld.c)/org_sqlite_jni_tester_SQLTester.h: $(dir.src.jni.tester)/SQLTester.java endif -#sqlite3-jni.dll.cfiles := $(dir.src.c) -sqlite3-jni.dll.cflags = \ +$(sqlite3-jni.h.in): $(dir.bld.c) + +#package.dll.cfiles := +package.dll.cflags = \ -fPIC \ -I. \ -I$(dir $(sqlite3.h)) \ @@ -234,22 +247,30 @@ sqlite3-jni.dll.cflags = \ # include path for client-level code. ######################################################################## ifeq (1,$(enable.tester)) - sqlite3-jni.dll.cflags += -DSQLITE_JNI_ENABLE_SQLTester + package.dll.cflags += -DSQLITE_JNI_ENABLE_SQLTester endif $(sqlite3-jni.h): $(sqlite3-jni.h.in) $(MAKEFILE) - cat $(sqlite3-jni.h.in) > $@ -$(sqlite3-jni.dll): $(sqlite3-jni.h) $(sqlite3.c) $(sqlite3.h) -$(sqlite3-jni.dll): $(dir.bld.c) $(sqlite3-jni.c) $(SQLite3Jni.java) $(MAKEFILE) - $(CC) $(sqlite3-jni.dll.cflags) $(SQLITE_OPT) \ + @cat $(sqlite3-jni.h.in) > $@.tmp + @if cmp $@ $@.tmp; then \ + rm -f $@.tmp; \ + echo "$@ not modified"; \ + else \ + mv $@.tmp $@; \ + echo "Updated $@"; \ + fi + +$(package.dll): $(sqlite3-jni.h) $(sqlite3.c) $(sqlite3.h) +$(package.dll): $(sqlite3-jni.c) $(MAKEFILE) + $(CC) $(package.dll.cflags) $(SQLITE_OPT) \ $(sqlite3-jni.c) -shared -o $@ -all: $(sqlite3-jni.dll) +all: $(package.dll) .PHONY: test test-one test.flags ?= test.main.flags = -ea -Djava.library.path=$(dir.bld.c) \ $(java.flags) -cp $(classpath) \ org.sqlite.jni.Tester1 -test.deps := $(SQLite3Jni.class) $(sqlite3-jni.dll) +test.deps := $(CLASS_FILES) $(package.dll) test-one: $(test.deps) $(bin.java) $(test.main.flags) $(test.flags) test-sqllog: $(test.deps) @@ -257,7 +278,7 @@ test-sqllog: $(test.deps) $(bin.java) $(test.main.flags) -sqllog test-mt: $(test.deps) @echo "Testing in multi-threaded mode:"; - $(bin.java) $(test.main.flags) -t 11 -r 50 -shuffle $(test.flags) + $(bin.java) $(test.main.flags) -t 7 -r 50 -shuffle $(test.flags) test: test-one test-mt tests: test test-sqllog @@ -266,7 +287,7 @@ tester.scripts := $(sort $(wildcard $(dir.src)/tests/*.test)) tester.flags ?= # --verbose .PHONY: tester tester-local tester-ext ifeq (1,$(enable.tester)) -tester-local: $(CLASS_FILES.tester) $(sqlite3-jni.dll) +tester-local: $(CLASS_FILES.tester) $(package.dll) $(bin.java) -ea -Djava.library.path=$(dir.bld.c) \ $(java.flags) -cp $(classpath) \ org.sqlite.jni.tester.SQLTester $(tester.flags) $(tester.scripts) @@ -313,16 +334,24 @@ multitest: clean # jar bundle... package.jar.in := $(abspath $(dir.src)/jar.in) CLEAN_FILES += $(package.jar.in) -$(package.jar.in): $(MAKEFILE) $(CLASS_FILES.main) - cd $(dir.src); ls -1 org/sqlite/jni/*.java org/sqlite/jni/*.class > $@ - @echo "To use this jar you will need the -Djava.library.path=DIR/CONTAINING/libsqlite3-jni.so flag." - @echo "e.g. java -jar $@ -Djava.library.path=bld" +JAVA_FILES.jar := $(JAVA_FILES.main) $(JAVA_FILES.unittest) $(JAVA_FILES.package.info) +CLASS_FILES.jar := $(filter-out %/package-info.class,$(JAVA_FILES.jar:.java=.class)) +$(package.jar.in): $(package.dll) $(MAKEFILE) + ls -1 \ + $(dir.src.jni)/*.java $(dir.src.jni)/*.class \ + $(dir.src.jni)/annotation/*.java $(dir.src.jni)/annotation/*.class \ + | sed -e 's,^$(dir.src)/,,' | sort > $@ -$(package.jar): $(CLASS_FILES) $(MAKEFILE) $(package.jar.in) - rm -f $(dir.src)/c/*~ $(dir.src.jni)/*~ +$(package.jar): $(CLASS_FILES.jar) $(MAKEFILE) $(package.jar.in) + @rm -f $(dir.src)/c/*~ $(dir.src.jni)/*~ cd $(dir.src); $(bin.jar) -cfe ../$@ org.sqlite.jni.Tester1 @$(package.jar.in) + @ls -la $@ + @echo "To use this jar you will need the -Djava.library.path=DIR/CONTAINING/libsqlite3-jni.so flag." + @echo "e.g. java -Djava.library.path=bld -jar $@" jar: $(package.jar) +run-jar: $(package.jar) $(package.dll) + $(bin.java) -Djava.library.path=$(dir.bld) -jar $(package.jar) $(run-jar.flags) ######################################################################## # javadoc... @@ -349,7 +378,7 @@ docserve: $(doc.index) CLEAN_FILES += $(dir.bld.c)/* \ $(dir.src.jni)/*.class \ $(dir.src.jni.tester)/*.class \ - $(sqlite3-jni.dll) \ + $(package.dll) \ hs_err_pid*.log .PHONY: clean distclean diff --git a/ext/jni/src/c/sqlite3-jni.c b/ext/jni/src/c/sqlite3-jni.c index bc15212251..8e654a1b28 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 a9f15fc6c2..6dbd9cb77b 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 1f8ace2fb8..4a36941306 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 db9295bb61..30a5edc037 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 similarity index 97% rename from ext/jni/src/org/sqlite/jni/SQLite3CallbackProxy.java rename to ext/jni/src/org/sqlite/jni/CallbackProxy.java index 5052664937..086c2f8e5d 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;
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 481c6cd956..7f0e79a3fa 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 e6c917a2c2..b72cf1ba53 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 253d0b8cfa..2e9a68d25d 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 b68dd4b6d4..a606139328 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 d15bf31a11..bc15377037 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 3bf9f79a1a..21600c8057 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 4bd7e42ed6..f47b5944a4 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