1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-30 19:03:16 +03:00

JNI build improvements. Rename a Java class. Get the jar target working again.

FossilOrigin-Name: d086b7844cace5c997261c97565aeef62aaeeef727ccc7e83f17c54d6217b779
This commit is contained in:
stephan
2023-09-01 09:43:56 +00:00
parent a4b47b034c
commit 55171a75ef
18 changed files with 136 additions and 90 deletions

View File

@ -31,6 +31,13 @@ mkdir := mkdir -p
$(dir.bld.c): $(dir.bld.c):
$(mkdir) $@ $(mkdir) $@
javac.flags ?= -Xlint:unchecked -Xlint:deprecation
java.flags ?=
jnicheck ?= 1
ifeq (1,$(jnicheck))
java.flags += -Xcheck:jni
endif
classpath := $(dir.src) classpath := $(dir.src)
CLEAN_FILES := $(package.jar) CLEAN_FILES := $(package.jar)
DISTCLEAN_FILES := $(dir.jni)/*~ $(dir.src.c)/*~ $(dir.src.jni)/*~ 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. # It would be a real doozy to bind to JNI.
enable.fts5 ?= 1 enable.fts5 ?= 1
# If enable.tester is 0, the org/sqlite/jni/tester/* bits are elided. # 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 # bin.version-info = binary to output various sqlite3 version info
# building the distribution zip file. # building the distribution zip file.
@ -62,7 +69,6 @@ JAVA_FILES.main := $(patsubst %,$(dir.src.jni)/%,\
annotation/Canonical.java \ annotation/Canonical.java \
annotation/NotNull.java \ annotation/NotNull.java \
annotation/Nullable.java \ annotation/Nullable.java \
annotation/package-info.java \
AbstractCollationCallback.java \ AbstractCollationCallback.java \
AggregateFunction.java \ AggregateFunction.java \
AuthorizerCallback.java \ AuthorizerCallback.java \
@ -80,20 +86,22 @@ JAVA_FILES.main := $(patsubst %,$(dir.src.jni)/%,\
RollbackHookCallback.java \ RollbackHookCallback.java \
ScalarFunction.java \ ScalarFunction.java \
SQLFunction.java \ SQLFunction.java \
CallbackProxy.java \
SQLite3Jni.java \ SQLite3Jni.java \
TableColumnMetadata.java \ TableColumnMetadata.java \
Tester1.java \
TraceV2Callback.java \ TraceV2Callback.java \
UpdateHookCallback.java \ UpdateHookCallback.java \
ValueHolder.java \ ValueHolder.java \
WindowFunction.java \ WindowFunction.java \
XDestroyCallback.java \ XDestroyCallback.java \
package-info.java \
sqlite3.java \ sqlite3.java \
sqlite3_context.java \ sqlite3_context.java \
sqlite3_stmt.java \ sqlite3_stmt.java \
sqlite3_value.java \ sqlite3_value.java \
) )
JAVA_FILES.unittest := $(patsubst %,$(dir.src.jni)/%,\
Tester1.java \
)
ifeq (1,$(enable.fts5)) ifeq (1,$(enable.fts5))
JAVA_FILES.main += $(patsubst %,$(dir.src.jni)/%,\ JAVA_FILES.main += $(patsubst %,$(dir.src.jni)/%,\
fts5_api.java \ fts5_api.java \
@ -109,32 +117,30 @@ ifeq (1,$(enable.fts5))
) )
endif endif
JAVA_FILES.tester := $(dir.src.jni.tester)/SQLTester.java 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.main := $(JAVA_FILES.main:.java=.class)
CLASS_FILES.unittest := $(JAVA_FILES.unittest:.java=.class)
CLASS_FILES.tester := $(JAVA_FILES.tester:.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)) ifeq (1,$(enable.tester))
JAVA_FILES += $(JAVA_FILES.tester) JAVA_FILES += $(JAVA_FILES.tester)
endif endif
CLASS_FILES := CLASS_FILES :=
define DOTCLASS_DEPS define CLASSFILE_DEPS
$(1).class: $(1).java $(MAKEFILE)
all: $(1).class all: $(1).class
CLASS_FILES += $(1).class CLASS_FILES += $(1).class
endef endef
$(foreach B,$(basename $(JAVA_FILES)),$(eval $(call DOTCLASS_DEPS,$(B)))) $(foreach B,$(basename \
$(CLASS_FILES.tester): $(CLASS_FILES.main) $(JAVA_FILES.main) $(JAVA_FILES.unittest) $(JAVA_FILES.tester)),\
javac.flags ?= -Xlint:unchecked -Xlint:deprecation $(eval $(call CLASSFILE_DEPS,$(B))))
java.flags ?= $(CLASS_FILES): $(JAVA_FILES) $(MAKEFILE)
jnicheck ?= 1
ifeq (1,$(jnicheck))
java.flags += -Xcheck:jni
endif
$(SQLite3Jni.class): $(JAVA_FILES)
$(bin.javac) $(javac.flags) -h $(dir.bld.c) -cp $(classpath) $(JAVA_FILES) $(bin.javac) $(javac.flags) -h $(dir.bld.c) -cp $(classpath) $(JAVA_FILES)
all: $(SQLite3Jni.class)
#.PHONY: classfiles #.PHONY: classfiles
######################################################################## ########################################################################
@ -199,13 +205,18 @@ endif
sqlite3-jni.c := $(dir.src.c)/sqlite3-jni.c sqlite3-jni.c := $(dir.src.c)/sqlite3-jni.c
sqlite3-jni.o := $(dir.bld.c)/sqlite3-jni.o sqlite3-jni.o := $(dir.bld.c)/sqlite3-jni.o
sqlite3-jni.h := $(dir.src.c)/sqlite3-jni.h 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): # All javac-generated .h files must be listed in $(sqlite3-jni.h.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 define ADD_JNI_H
sqlite3-jni.h.in += $$(dir.bld.c)/org_sqlite_jni_$(1).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 $$(dir.bld.c)/org_sqlite_jni_$(1).h: $$(dir.src.jni)/$(1).java
endef endef
# Invoke ADD_JNI_H once for each Java file which includes JNI
# declarations:
$(eval $(call ADD_JNI_H,SQLite3Jni)) $(eval $(call ADD_JNI_H,SQLite3Jni))
ifeq (1,$(enable.fts5)) ifeq (1,$(enable.fts5))
$(eval $(call ADD_JNI_H,Fts5ExtensionApi)) $(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 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 $(dir.bld.c)/org_sqlite_jni_tester_SQLTester.h: $(dir.src.jni.tester)/SQLTester.java
endif endif
#sqlite3-jni.dll.cfiles := $(dir.src.c) $(sqlite3-jni.h.in): $(dir.bld.c)
sqlite3-jni.dll.cflags = \
#package.dll.cfiles :=
package.dll.cflags = \
-fPIC \ -fPIC \
-I. \ -I. \
-I$(dir $(sqlite3.h)) \ -I$(dir $(sqlite3.h)) \
@ -234,22 +247,30 @@ sqlite3-jni.dll.cflags = \
# include path for client-level code. # include path for client-level code.
######################################################################## ########################################################################
ifeq (1,$(enable.tester)) ifeq (1,$(enable.tester))
sqlite3-jni.dll.cflags += -DSQLITE_JNI_ENABLE_SQLTester package.dll.cflags += -DSQLITE_JNI_ENABLE_SQLTester
endif endif
$(sqlite3-jni.h): $(sqlite3-jni.h.in) $(MAKEFILE) $(sqlite3-jni.h): $(sqlite3-jni.h.in) $(MAKEFILE)
cat $(sqlite3-jni.h.in) > $@ @cat $(sqlite3-jni.h.in) > $@.tmp
$(sqlite3-jni.dll): $(sqlite3-jni.h) $(sqlite3.c) $(sqlite3.h) @if cmp $@ $@.tmp; then \
$(sqlite3-jni.dll): $(dir.bld.c) $(sqlite3-jni.c) $(SQLite3Jni.java) $(MAKEFILE) rm -f $@.tmp; \
$(CC) $(sqlite3-jni.dll.cflags) $(SQLITE_OPT) \ 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 $@ $(sqlite3-jni.c) -shared -o $@
all: $(sqlite3-jni.dll) all: $(package.dll)
.PHONY: test test-one .PHONY: test test-one
test.flags ?= test.flags ?=
test.main.flags = -ea -Djava.library.path=$(dir.bld.c) \ test.main.flags = -ea -Djava.library.path=$(dir.bld.c) \
$(java.flags) -cp $(classpath) \ $(java.flags) -cp $(classpath) \
org.sqlite.jni.Tester1 org.sqlite.jni.Tester1
test.deps := $(SQLite3Jni.class) $(sqlite3-jni.dll) test.deps := $(CLASS_FILES) $(package.dll)
test-one: $(test.deps) test-one: $(test.deps)
$(bin.java) $(test.main.flags) $(test.flags) $(bin.java) $(test.main.flags) $(test.flags)
test-sqllog: $(test.deps) test-sqllog: $(test.deps)
@ -257,7 +278,7 @@ test-sqllog: $(test.deps)
$(bin.java) $(test.main.flags) -sqllog $(bin.java) $(test.main.flags) -sqllog
test-mt: $(test.deps) test-mt: $(test.deps)
@echo "Testing in multi-threaded mode:"; @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 test: test-one test-mt
tests: test test-sqllog tests: test test-sqllog
@ -266,7 +287,7 @@ tester.scripts := $(sort $(wildcard $(dir.src)/tests/*.test))
tester.flags ?= # --verbose tester.flags ?= # --verbose
.PHONY: tester tester-local tester-ext .PHONY: tester tester-local tester-ext
ifeq (1,$(enable.tester)) 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) \ $(bin.java) -ea -Djava.library.path=$(dir.bld.c) \
$(java.flags) -cp $(classpath) \ $(java.flags) -cp $(classpath) \
org.sqlite.jni.tester.SQLTester $(tester.flags) $(tester.scripts) org.sqlite.jni.tester.SQLTester $(tester.flags) $(tester.scripts)
@ -313,16 +334,24 @@ multitest: clean
# jar bundle... # jar bundle...
package.jar.in := $(abspath $(dir.src)/jar.in) package.jar.in := $(abspath $(dir.src)/jar.in)
CLEAN_FILES += $(package.jar.in) CLEAN_FILES += $(package.jar.in)
$(package.jar.in): $(MAKEFILE) $(CLASS_FILES.main) JAVA_FILES.jar := $(JAVA_FILES.main) $(JAVA_FILES.unittest) $(JAVA_FILES.package.info)
cd $(dir.src); ls -1 org/sqlite/jni/*.java org/sqlite/jni/*.class > $@ CLASS_FILES.jar := $(filter-out %/package-info.class,$(JAVA_FILES.jar:.java=.class))
@echo "To use this jar you will need the -Djava.library.path=DIR/CONTAINING/libsqlite3-jni.so flag." $(package.jar.in): $(package.dll) $(MAKEFILE)
@echo "e.g. java -jar $@ -Djava.library.path=bld" 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) $(package.jar): $(CLASS_FILES.jar) $(MAKEFILE) $(package.jar.in)
rm -f $(dir.src)/c/*~ $(dir.src.jni)/*~ @rm -f $(dir.src)/c/*~ $(dir.src.jni)/*~
cd $(dir.src); $(bin.jar) -cfe ../$@ org.sqlite.jni.Tester1 @$(package.jar.in) 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) jar: $(package.jar)
run-jar: $(package.jar) $(package.dll)
$(bin.java) -Djava.library.path=$(dir.bld) -jar $(package.jar) $(run-jar.flags)
######################################################################## ########################################################################
# javadoc... # javadoc...
@ -349,7 +378,7 @@ docserve: $(doc.index)
CLEAN_FILES += $(dir.bld.c)/* \ CLEAN_FILES += $(dir.bld.c)/* \
$(dir.src.jni)/*.class \ $(dir.src.jni)/*.class \
$(dir.src.jni.tester)/*.class \ $(dir.src.jni.tester)/*.class \
$(sqlite3-jni.dll) \ $(package.dll) \
hs_err_pid*.log hs_err_pid*.log
.PHONY: clean distclean .PHONY: clean distclean

View File

@ -266,6 +266,7 @@ static void * s3jni_realloc_or_die(JNIEnv * const env, void * p, size_t n){
#else #else
#define s3jni_oom_check(EXPR) #define s3jni_oom_check(EXPR)
#endif #endif
//#define S3JniDb_oom(pDb,EXPR) ((EXPR) ? sqlite3OomFault(pDb) : 0)
/* Helpers for Java value reference management. */ /* Helpers for Java value reference management. */
static jobject s3jni_ref_global(JNIEnv * const env, jobject const v){ 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;
const S3JniNphRef OutputPointer_sqlite3_stmt; const S3JniNphRef OutputPointer_sqlite3_stmt;
const S3JniNphRef OutputPointer_sqlite3_value; const S3JniNphRef OutputPointer_sqlite3_value;
#ifdef SQLITE_ENABLE_FTS5
const S3JniNphRef OutputPointer_String; const S3JniNphRef OutputPointer_String;
#ifdef SQLITE_ENABLE_FTS5
const S3JniNphRef OutputPointer_ByteArray; const S3JniNphRef OutputPointer_ByteArray;
const S3JniNphRef Fts5Context; const S3JniNphRef Fts5Context;
const S3JniNphRef Fts5ExtensionApi; const S3JniNphRef Fts5ExtensionApi;
@ -346,8 +347,8 @@ static const struct {
"Lorg/sqlite/jni/sqlite3_stmt;"), "Lorg/sqlite/jni/sqlite3_stmt;"),
RefO(9, "OutputPointer$sqlite3_value", RefO(9, "OutputPointer$sqlite3_value",
"Lorg/sqlite/jni/sqlite3_value;"), "Lorg/sqlite/jni/sqlite3_value;"),
#ifdef SQLITE_ENABLE_FTS5
RefO(10, "OutputPointer$String", "Ljava/lang/String;"), RefO(10, "OutputPointer$String", "Ljava/lang/String;"),
#ifdef SQLITE_ENABLE_FTS5
RefO(11, "OutputPointer$ByteArray", "[B"), RefO(11, "OutputPointer$ByteArray", "[B"),
RefN(12, "Fts5Context"), RefN(12, "Fts5Context"),
RefN(13, "Fts5ExtensionApi"), 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 ** Per-(sqlite3*) state for various JNI bindings. This state is
** allocated as needed, cleaned up in sqlite3_close(_v2)(), and ** allocated as needed, cleaned up in sqlite3_close(_v2)(), and
** recycled when possible. ** 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; typedef struct S3JniDb S3JniDb;
struct S3JniDb { struct S3JniDb {
@ -453,6 +458,10 @@ static const char * const S3JniDb_clientdata_key = "S3JniDb";
/* /*
** Cache for per-JNIEnv (i.e. per-thread) data. ** 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; typedef struct S3JniEnv S3JniEnv;
struct 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. ** from it, or no matching entry can be found.
*/ */
static S3JniDb * S3JniDb__from_java(JNIEnv * const env, jobject jDb){ static S3JniDb * S3JniDb__from_java(JNIEnv * const env, jobject jDb){
S3JniDb * s = 0; sqlite3 * const pDb = jDb ? PtrGet_sqlite3(jDb) : 0;
sqlite3 * pDb = 0; return pDb ? S3JniDb_from_clientdata(pDb) : 0;
if( jDb ) pDb = PtrGet_sqlite3(jDb);
s = S3JniDb_from_clientdata(pDb);
return s;
} }
#define S3JniDb_from_java(jObject) S3JniDb__from_java(env,(jObject)) #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); rc = sqlite3_trace_v2(ps->pDb, (unsigned)traceMask, s3jni_trace_impl, ps);
if( 0==rc ){ if( 0==rc ){
S3JniHook_unref(&ps->hooks.trace); S3JniHook_unref(&ps->hooks.trace);
ps->hooks.trace = hook; ps->hooks.trace = hook /* transfer ownership of reference */;
}else{ }else{
S3JniHook_unref(&hook); S3JniHook_unref(&hook);
} }

View File

@ -17,7 +17,7 @@ import org.sqlite.jni.annotation.*;
/** /**
Callback for use with {@link SQLite3Jni#sqlite3_set_authorizer}. 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 Must function as described for the C-level
sqlite3_set_authorizer() callback. sqlite3_set_authorizer() callback.

View File

@ -17,7 +17,7 @@ package org.sqlite.jni;
Callback for use with the {@link SQLite3Jni#sqlite3_auto_extension} Callback for use with the {@link SQLite3Jni#sqlite3_auto_extension}
family of APIs. family of APIs.
*/ */
public interface AutoExtensionCallback extends SQLite3CallbackProxy { public interface AutoExtensionCallback extends CallbackProxy {
/** /**
Must function as described for a C-level Must function as described for a C-level
sqlite3_auto_extension() callback. sqlite3_auto_extension() callback.

View File

@ -16,7 +16,7 @@ package org.sqlite.jni;
/** /**
Callback for use with {@link SQLite3Jni#sqlite3_busy_handler}. 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 Must function as documented for the C-level
sqlite3_busy_handler() callback argument, minus the (void*) sqlite3_busy_handler() callback argument, minus the (void*)

View File

@ -41,4 +41,4 @@ package org.sqlite.jni;
<p>2) They all have a {@code call()} method but its signature is <p>2) They all have a {@code call()} method but its signature is
callback-specific. callback-specific.
*/ */
public interface SQLite3CallbackProxy {} public interface CallbackProxy {}

View File

@ -20,7 +20,7 @@ import org.sqlite.jni.annotation.NotNull;
@see AbstractCollationCallback @see AbstractCollationCallback
*/ */
public interface CollationCallback public interface CollationCallback
extends SQLite3CallbackProxy, XDestroyCallback { extends CallbackProxy, XDestroyCallback {
/** /**
Must compare the given byte arrays and return the result using Must compare the given byte arrays and return the result using
{@code memcmp()} semantics. {@code memcmp()} semantics.

View File

@ -16,7 +16,7 @@ package org.sqlite.jni;
/** /**
Callback for use with {@link SQLite3Jni#sqlite3_collation_needed}. 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() Has the same semantics as the C-level sqlite3_create_collation()
callback. callback.

View File

@ -16,7 +16,7 @@ package org.sqlite.jni;
/** /**
Callback for use with {@link SQLite3Jni#sqlite3_commit_hook}. 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() Works as documented for the C-level sqlite3_commit_hook()
callback. Must not throw. callback. Must not throw.

View File

@ -16,7 +16,7 @@ package org.sqlite.jni;
/** /**
Callback for use with {@link SQLite3Jni#sqlite3_preupdate_hook}. 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() Must function as described for the C-level sqlite3_preupdate_hook()
callback. callback.

View File

@ -16,7 +16,7 @@ package org.sqlite.jni;
/** /**
Callback for use with {@link SQLite3Jni#sqlite3_progress_handler}. 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. Works as documented for the C-level sqlite3_progress_handler() callback.

View File

@ -16,7 +16,7 @@ package org.sqlite.jni;
/** /**
Callback for use with {@link SQLite3Jni#sqlite3_rollback_hook}. 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() Works as documented for the C-level sqlite3_rollback_hook()
callback. callback.

View File

@ -74,9 +74,15 @@ public class Tester1 implements Runnable {
} }
} }
public synchronized static void outln(Object val){ public synchronized static void outPrefix(){
if( !quietMode ){ if( !quietMode ){
System.out.print(Thread.currentThread().getName()+": "); System.out.print(Thread.currentThread().getName()+": ");
}
}
public synchronized static void outln(Object val){
if( !quietMode ){
outPrefix();
System.out.println(val); System.out.println(val);
} }
} }
@ -90,7 +96,7 @@ public class Tester1 implements Runnable {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public synchronized static void out(Object... vals){ public synchronized static void out(Object... vals){
if( !quietMode ){ if( !quietMode ){
System.out.print(Thread.currentThread().getName()+": "); outPrefix();
for(Object v : vals) out(v); for(Object v : vals) out(v);
} }
} }
@ -429,7 +435,7 @@ public class Tester1 implements Runnable {
sqlite3 db = createNewDb(); sqlite3 db = createNewDb();
execSql(db, "CREATE TABLE t(a)"); execSql(db, "CREATE TABLE t(a)");
sqlite3_stmt stmt = prepare(db, "INSERT INTO t(a) VALUES(?);"); sqlite3_stmt stmt = prepare(db, "INSERT INTO t(a) VALUES(?);");
String[] list1 = { "hell🤩", "w😃rld", "!" }; String[] list1 = { "hell🤩", "w😃rld", "!🤩" };
int rc; int rc;
int n = 0; int n = 0;
for( String e : list1 ){ for( String e : list1 ){
@ -450,14 +456,16 @@ public class Tester1 implements Runnable {
final String txt = sqlite3_column_text16(stmt, 0); final String txt = sqlite3_column_text16(stmt, 0);
sbuf.append( txt ); sbuf.append( txt );
affirm( txt.equals(sqlite3_column_text(stmt, 0)) ); affirm( txt.equals(sqlite3_column_text(stmt, 0)) );
affirm( txt.length() < sqlite3_value_bytes(sv) );
affirm( txt.equals(sqlite3_value_text(sv)) ); affirm( txt.equals(sqlite3_value_text(sv)) );
affirm( txt.length() == sqlite3_value_bytes16(sv)/2 );
affirm( txt.equals(sqlite3_value_text16(sv)) ); affirm( txt.equals(sqlite3_value_text16(sv)) );
sqlite3_value_free(sv); sqlite3_value_free(sv);
++n; ++n;
} }
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
affirm(3 == n); affirm(3 == n);
affirm("w😃rldhell🤩!".equals(sbuf.toString())); affirm("w😃rldhell🤩!🤩".equals(sbuf.toString()));
sqlite3_close_v2(db); sqlite3_close_v2(db);
} }
@ -1655,18 +1663,20 @@ public class Tester1 implements Runnable {
sqlite3_libversion_number(),"\n", sqlite3_libversion_number(),"\n",
sqlite3_libversion(),"\n",SQLITE_SOURCE_ID,"\n", sqlite3_libversion(),"\n",SQLITE_SOURCE_ID,"\n",
"SQLITE_THREADSAFE=",SQLITE_THREADSAFE); "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."); if( takeNaps ) outln("Napping between tests is enabled.");
for( int n = 0; n < nRepeat; ++n ){ for( int n = 0; n < nRepeat; ++n ){
++nLoop; ++nLoop;
out((1==nLoop ? "" : " ")+nLoop); if( showLoopCount ) out((1==nLoop ? "" : " ")+nLoop);
if( nThread<=1 ){ if( nThread<=1 ){
new Tester1(0).runTests(false); new Tester1(0).runTests(false);
continue; continue;
} }
Tester1.mtMode = true; Tester1.mtMode = true;
final ExecutorService ex = Executors.newFixedThreadPool( nThread ); final ExecutorService ex = Executors.newFixedThreadPool( nThread );
//final List<Future<?>> futures = new ArrayList<>();
for( int i = 0; i < nThread; ++i ){ for( int i = 0; i < nThread; ++i ){
ex.submit( new Tester1(i), i ); ex.submit( new Tester1(i), i );
} }
@ -1689,7 +1699,7 @@ public class Tester1 implements Runnable {
if( null!=err ) throw err; if( null!=err ) throw err;
} }
} }
outln(); if( showLoopCount ) outln();
quietMode = false; quietMode = false;
final long timeEnd = System.currentTimeMillis(); final long timeEnd = System.currentTimeMillis();
@ -1706,7 +1716,7 @@ public class Tester1 implements Runnable {
final java.lang.reflect.Method[] declaredMethods = final java.lang.reflect.Method[] declaredMethods =
SQLite3Jni.class.getDeclaredMethods(); SQLite3Jni.class.getDeclaredMethods();
for(java.lang.reflect.Method m : declaredMethods){ for(java.lang.reflect.Method m : declaredMethods){
int mod = m.getModifiers(); final int mod = m.getModifiers();
if( 0!=(mod & java.lang.reflect.Modifier.STATIC) ){ if( 0!=(mod & java.lang.reflect.Modifier.STATIC) ){
final String name = m.getName(); final String name = m.getName();
if(name.startsWith("sqlite3_")){ if(name.startsWith("sqlite3_")){

View File

@ -17,7 +17,7 @@ import org.sqlite.jni.annotation.Nullable;
/** /**
Callback for use with {@link SQLite3Jni#sqlite3_trace_v2}. 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 Called by sqlite3 for various tracing operations, as per
sqlite3_trace_v2(). Note that this interface elides the 2nd sqlite3_trace_v2(). Note that this interface elides the 2nd

View File

@ -16,7 +16,7 @@ package org.sqlite.jni;
/** /**
Callback for use with {@link SQLite3Jni#sqlite3_update_hook}. 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() Must function as described for the C-level sqlite3_update_hook()
callback. callback.

View File

@ -12,9 +12,10 @@
as cross-language semantics allow for. A closely-related goal is as cross-language semantics allow for. A closely-related goal is
that <a href='https://sqlite.org/c3ref/intro.html'>the C that <a href='https://sqlite.org/c3ref/intro.html'>the C
documentation</a> should be usable as-is, insofar as possible, documentation</a> should be usable as-is, insofar as possible,
for most of the JNI binding. As a rule, undocumented symbols for most of the JNI binding. As a rule, undocumented symbols in
behave as documented for their C API counterpart, and only the Java interface behave as documented for their C API
semantic differences are documented here.</li> counterpart. Only semantic differences and Java-specific features
are documented here.</li>
<li>Support Java as far back as version 8 (2014).</li> <li>Support Java as far back as version 8 (2014).</li>

View File

@ -1,5 +1,5 @@
C Expose\ssqlite3_stmt_explain(),\ssqlite3_stmt_isexplain(),\sand\ssqlite3_stmt_readonly()\sto\sJNI. C JNI\sbuild\simprovements.\sRename\sa\sJava\sclass.\sGet\sthe\sjar\starget\sworking\sagain.
D 2023-09-01T06:50:17.074 D 2023-09-01T09:43:56.871
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@ -234,19 +234,20 @@ F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c
F ext/icu/README.txt 7ab7ced8ae78e3a645b57e78570ff589d4c672b71370f5aa9e1cd7024f400fc9 F ext/icu/README.txt 7ab7ced8ae78e3a645b57e78570ff589d4c672b71370f5aa9e1cd7024f400fc9
F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282 F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282
F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8 F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8
F ext/jni/GNUmakefile b6ae6d04cc33f2300ab7177bd5db1ecfbc8627f76fee6aec441f980e57594291 F ext/jni/GNUmakefile c6100f8855f9f533466d75e031a458875003c5b5cc01fe9a34581d55f0048119
F ext/jni/README.md 1332b1fa27918bd5d9ca2d0d4f3ac3a6ab86b9e3699dc5bfe32904a027f3d2a9 F ext/jni/README.md 1332b1fa27918bd5d9ca2d0d4f3ac3a6ab86b9e3699dc5bfe32904a027f3d2a9
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
F ext/jni/src/c/sqlite3-jni.c 6342a09eb10c46835b4b3ea84f1cfaeb9e7e720c0c15c7405fb18bfc62f9cc0f F ext/jni/src/c/sqlite3-jni.c 94092d07a8a5df2cb66f4ac04a28d150ed29361a7aec82776bfdd3f1a3b947e8
F ext/jni/src/c/sqlite3-jni.h 3546b35d31fe3c13697edf3a3c35871941283de1d4f189154456ca61fd1282f6 F ext/jni/src/c/sqlite3-jni.h 3546b35d31fe3c13697edf3a3c35871941283de1d4f189154456ca61fd1282f6
F ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java 95e88ba04f4aac51ffec65693e878e234088b2f21b387f4e4285c8b72b33e436 F ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java 95e88ba04f4aac51ffec65693e878e234088b2f21b387f4e4285c8b72b33e436
F ext/jni/src/org/sqlite/jni/AggregateFunction.java 7312486bc65fecdb91753c0a4515799194e031f45edbe16a6373cea18f404dc4 F ext/jni/src/org/sqlite/jni/AggregateFunction.java 7312486bc65fecdb91753c0a4515799194e031f45edbe16a6373cea18f404dc4
F ext/jni/src/org/sqlite/jni/AuthorizerCallback.java d00a2409ab76cae168927e2ca6a7ffbd0621a42547cce88768b4eeebc13827e0 F ext/jni/src/org/sqlite/jni/AuthorizerCallback.java e6135be32f12bf140bffa39be7fd1a45ad83b2661ed49c08dbde04c8485feb38
F ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java 1470e14d09f10729d35568506c6e61318edfb17aa322802e386764fa6d582f14 F ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java 5e4a75611c026730289d776469d6122cb2699d6970af5f53fe85e74d49930476
F ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java cd12c26dafd3e6c097fc73f80d328aebac0f58b985f66a96ee567ddf8d195f30 F ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java d316373b12b3bf1a421f1f7eed08128fa8dd52bb98617ba28c161aaabd71d1ee
F ext/jni/src/org/sqlite/jni/CollationCallback.java 7d5b246f1a7c9d6b8e974d970bbbb2d05c6264e65448d7be6a85edbf703c823d F ext/jni/src/org/sqlite/jni/CallbackProxy.java 064a8a00e4c63cc501c30504f93ca996d422c5f010067f969b2d0a10f0868153 w ext/jni/src/org/sqlite/jni/SQLite3CallbackProxy.java
F ext/jni/src/org/sqlite/jni/CollationNeededCallback.java 1707b50146c6b805b79e84f89a57c8dbb0134e431799f041f0bec403eca5f841 F ext/jni/src/org/sqlite/jni/CollationCallback.java df327348e1a34ee65210208d694d690e5ee0bfe901410122e07caf6c98b2b7c8
F ext/jni/src/org/sqlite/jni/CommitHookCallback.java e4de82c97560982e996e358958268e1e4e307b6115cd9aac0ff4f947d4380d90 F ext/jni/src/org/sqlite/jni/CollationNeededCallback.java 07df5fa161a0b81154295258037f662e7c372735c2899c76e81cb3abd9fd3b39
F ext/jni/src/org/sqlite/jni/CommitHookCallback.java 77cf8bb4f5548113e9792978f3f8a454614f420fa0ad73939421cbff4e7776f2
F ext/jni/src/org/sqlite/jni/ConfigSqllogCallback.java e3656909eab7ed0f7e457c5b82df160ca22dd5e954c0a306ec1fca61b0d266b4 F ext/jni/src/org/sqlite/jni/ConfigSqllogCallback.java e3656909eab7ed0f7e457c5b82df160ca22dd5e954c0a306ec1fca61b0d266b4
F ext/jni/src/org/sqlite/jni/Fts5.java 3ebfbd5b95fdb9d7bc40306f2e682abd12e247d9224e92510b8dd103b4f96fe8 F ext/jni/src/org/sqlite/jni/Fts5.java 3ebfbd5b95fdb9d7bc40306f2e682abd12e247d9224e92510b8dd103b4f96fe8
F ext/jni/src/org/sqlite/jni/Fts5Context.java 0a5a02047a6a1dd3e4a38b0e542a8dd2de365033ba30e6ae019a676305959890 F ext/jni/src/org/sqlite/jni/Fts5Context.java 0a5a02047a6a1dd3e4a38b0e542a8dd2de365033ba30e6ae019a676305959890
@ -256,19 +257,18 @@ F ext/jni/src/org/sqlite/jni/Fts5PhraseIter.java 6642beda341c0b1b46af4e2d7f6f9ab
F ext/jni/src/org/sqlite/jni/Fts5Tokenizer.java 91489893596b6528c0df5cd7180bd5b55809c26e2b797fb321dfcdbc1298c060 F ext/jni/src/org/sqlite/jni/Fts5Tokenizer.java 91489893596b6528c0df5cd7180bd5b55809c26e2b797fb321dfcdbc1298c060
F ext/jni/src/org/sqlite/jni/NativePointerHolder.java 564087036449a16df148dcf0a067408bd251170bf23286c655f46b5f973e8b2d F ext/jni/src/org/sqlite/jni/NativePointerHolder.java 564087036449a16df148dcf0a067408bd251170bf23286c655f46b5f973e8b2d
F ext/jni/src/org/sqlite/jni/OutputPointer.java 1f2319976fff206f5056eafc8a4f48d43abe09d5d1b5287ba9145a95d847cbb7 F ext/jni/src/org/sqlite/jni/OutputPointer.java 1f2319976fff206f5056eafc8a4f48d43abe09d5d1b5287ba9145a95d847cbb7
F ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java 500c968b3893edbddf67e8eb773852c3a8ae58097a77bd22320ada6b1af06db1 F ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java eccaed8dc9c6289f07ef3fc109891c6be1e7cc6c88723d90174b68706fc21cda
F ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java 0da841810319f5a9dc372d0f2348930d54fac1a4b53e4298884f44c720d67830 F ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java 7b9ff2218129ece98ba60c57eeedcd8447e9e3b6e5d0f5e5d3eb0f0c5037d48d
F ext/jni/src/org/sqlite/jni/ResultCode.java ba701f20213a5f259e94cfbfdd36eb7ac7ce7797f2c6c7fca2004ff12ce20f86 F ext/jni/src/org/sqlite/jni/ResultCode.java ba701f20213a5f259e94cfbfdd36eb7ac7ce7797f2c6c7fca2004ff12ce20f86
F ext/jni/src/org/sqlite/jni/RollbackHookCallback.java 16042be9d072a26dbb2f1b1b63e7639989b747bb80d2bd667ba4f7555f56a825 F ext/jni/src/org/sqlite/jni/RollbackHookCallback.java d12352c0e22840de484ffa9b11ed5058bb0daca2e9f218055d3c54c947a273c4
F ext/jni/src/org/sqlite/jni/SQLFunction.java 544a875d33fd160467d82e2397ac33157b29971d715a821a4fad3c899113ee8c F ext/jni/src/org/sqlite/jni/SQLFunction.java 544a875d33fd160467d82e2397ac33157b29971d715a821a4fad3c899113ee8c
F ext/jni/src/org/sqlite/jni/SQLite3CallbackProxy.java c2748ab52856075b053a55b317988d95dc7fb4d3d42520f8c33573effe1cd185
F ext/jni/src/org/sqlite/jni/SQLite3Jni.java af43be2c0795e22ca489d9237697cf743a9338860ba937ea689cd1810bf737ee F ext/jni/src/org/sqlite/jni/SQLite3Jni.java af43be2c0795e22ca489d9237697cf743a9338860ba937ea689cd1810bf737ee
F ext/jni/src/org/sqlite/jni/ScalarFunction.java 6d387bb499fbe3bc13c53315335233dbf6a0c711e8fa7c521683219b041c614c F ext/jni/src/org/sqlite/jni/ScalarFunction.java 6d387bb499fbe3bc13c53315335233dbf6a0c711e8fa7c521683219b041c614c
F ext/jni/src/org/sqlite/jni/TableColumnMetadata.java 54511b4297fa28dcb3f49b24035e34ced10e3fd44fd0e458e784f4d6b0096dab F ext/jni/src/org/sqlite/jni/TableColumnMetadata.java 54511b4297fa28dcb3f49b24035e34ced10e3fd44fd0e458e784f4d6b0096dab
F ext/jni/src/org/sqlite/jni/Tester1.java 891255bbaac87893fafe3b0109f6dbc9329c2accfd5b5c7a0b2bd9d874810ede F ext/jni/src/org/sqlite/jni/Tester1.java 3de9259606b40576e8a87dd28b228bbd077cccb518afec101246a14acd258c5f
F ext/jni/src/org/sqlite/jni/TesterFts5.java 6f135c60e24c89e8eecb9fe61dde0f3bb2906de668ca6c9186bcf34bdaf94629 F ext/jni/src/org/sqlite/jni/TesterFts5.java 6f135c60e24c89e8eecb9fe61dde0f3bb2906de668ca6c9186bcf34bdaf94629
F ext/jni/src/org/sqlite/jni/TraceV2Callback.java 641926b05a772c2c05c842a81aa839053ba4a13b78ef04b402f5705d060c6246 F ext/jni/src/org/sqlite/jni/TraceV2Callback.java beb0b064c1a5f8bfe585a324ed39a4e33edbe379a3fc60f1401661620d3ca7c0
F ext/jni/src/org/sqlite/jni/UpdateHookCallback.java be2bc96ff4f56b3c1fd18ae7dba9b207b25b6c123b8a5fd2f7aaf3cc208d8b7d F ext/jni/src/org/sqlite/jni/UpdateHookCallback.java 8376f4a931f2d5612b295c003c9515ba933ee76d8f95610e89c339727376e36c
F ext/jni/src/org/sqlite/jni/ValueHolder.java f022873abaabf64f3dd71ab0d6037c6e71cece3b8819fa10bf26a5461dc973ee F ext/jni/src/org/sqlite/jni/ValueHolder.java f022873abaabf64f3dd71ab0d6037c6e71cece3b8819fa10bf26a5461dc973ee
F ext/jni/src/org/sqlite/jni/WindowFunction.java 488980f4dbb6bdd7067d6cb9c43e4075475e51c54d9b74a5834422654b126246 F ext/jni/src/org/sqlite/jni/WindowFunction.java 488980f4dbb6bdd7067d6cb9c43e4075475e51c54d9b74a5834422654b126246
F ext/jni/src/org/sqlite/jni/XDestroyCallback.java 50c5ca124ef6c6b735a7e136e7a23a557be367e61b56d4aab5777a614ab46cc2 F ext/jni/src/org/sqlite/jni/XDestroyCallback.java 50c5ca124ef6c6b735a7e136e7a23a557be367e61b56d4aab5777a614ab46cc2
@ -279,7 +279,7 @@ F ext/jni/src/org/sqlite/jni/annotation/package-info.java f66bfb621c6494e67c03ed
F ext/jni/src/org/sqlite/jni/fts5_api.java ee47f1837d32968f7bb62278c7504c0fb572a68ec107371b714578312e9f734b F ext/jni/src/org/sqlite/jni/fts5_api.java ee47f1837d32968f7bb62278c7504c0fb572a68ec107371b714578312e9f734b
F ext/jni/src/org/sqlite/jni/fts5_extension_function.java ac825035d7d83fc7fd960347abfa6803e1614334a21533302041823ad5fc894c F ext/jni/src/org/sqlite/jni/fts5_extension_function.java ac825035d7d83fc7fd960347abfa6803e1614334a21533302041823ad5fc894c
F ext/jni/src/org/sqlite/jni/fts5_tokenizer.java a92c2e55bda492e4c76d48ddc73369bcc0d5e8727940840f9339e3292ea58fa7 F ext/jni/src/org/sqlite/jni/fts5_tokenizer.java a92c2e55bda492e4c76d48ddc73369bcc0d5e8727940840f9339e3292ea58fa7
F ext/jni/src/org/sqlite/jni/package-info.java 016cda6582ffb7af976455360f0730bf075a0ef4ef9d561f7646790c951e1504 F ext/jni/src/org/sqlite/jni/package-info.java a3946db2504de747a1993c4f6e8ce604bec5a8e5a134b292c3b07527bc321a99
F ext/jni/src/org/sqlite/jni/sqlite3.java 62b1b81935ccf3393472d17cb883dc5ff39c388ec3bc1de547f098a0217158fc F ext/jni/src/org/sqlite/jni/sqlite3.java 62b1b81935ccf3393472d17cb883dc5ff39c388ec3bc1de547f098a0217158fc
F ext/jni/src/org/sqlite/jni/sqlite3_context.java 66ca95ce904044263a4aff684abe262d56f73e6b06bca6cf650761d79d7779ad F ext/jni/src/org/sqlite/jni/sqlite3_context.java 66ca95ce904044263a4aff684abe262d56f73e6b06bca6cf650761d79d7779ad
F ext/jni/src/org/sqlite/jni/sqlite3_stmt.java 78e6d1b95ac600a9475e9db4623f69449322b0c93d1bd4e1616e76ed547ed9fc F ext/jni/src/org/sqlite/jni/sqlite3_stmt.java 78e6d1b95ac600a9475e9db4623f69449322b0c93d1bd4e1616e76ed547ed9fc
@ -2116,8 +2116,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P d732f71d0a292dbb493f79f7c6ecd8a4effbfbc91453b1c54bdd9becf2d75bdb P 208b786afe16eafaf0ce791f319a5e05f733a7b71ce1c542e1b83481b013ec38
R d6cbdc791e6b94495eeb2607a5aa6bb1 R 2b0398aeaa0204ef877d7a162bfccfd2
U stephan U stephan
Z d7105d8e3faee08846ef7fd47243b17f Z 4d9595c68497abda167c9e1929e109f6
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@ -1 +1 @@
208b786afe16eafaf0ce791f319a5e05f733a7b71ce1c542e1b83481b013ec38 d086b7844cace5c997261c97565aeef62aaeeef727ccc7e83f17c54d6217b779