# Be explicit about which Java files to compile so that we can work on
# in-progress files without requiring them to be in a compilable statae.
JAVA_FILES.main := $(patsubst %,$(dir.src.jni)/%,\
+ AggregateFunction.java \
AuthorizerCallback.java \
AutoExtensionCallback.java \
BusyHandlerCallback.java \
ProgressHandlerCallback.java \
ResultCode.java \
RollbackHookCallback.java \
+ ScalarFunction.java \
SQLFunction.java \
SQLite3Jni.java \
Tester1.java \
TraceV2Callback.java \
UpdateHookCallback.java \
ValueHolder.java \
+ WindowFunction.java \
XDestroyCallback.java \
package-info.java \
sqlite3.java \
.FORCE: doc
doc: $(doc.index)
javadoc: $(doc.index)
+# Force rebild of docs
+redoc:
+ @rm -f $(doc.index)/index.html
+ @$(MAKE) doc
docserve: $(doc.index)
cd $(dir.doc) && althttpd -max-age 1 -page index.html
########################################################################
--- /dev/null
+/*
+** 2023-08-25
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file is part of the JNI bindings for the sqlite3 C API.
+*/
+package org.sqlite.jni;
+
+
+/**
+ SQLFunction subclass for creating aggregate functions. Its T is
+ the data type of its "accumulator" state, an instance of which is
+ intended to be be managed using the getAggregateState() and
+ takeAggregateState() methods.
+*/
+public abstract class AggregateFunction<T> extends SQLFunction {
+
+ /**
+ As for the xStep() argument of the C API's
+ sqlite3_create_function(). If this function throws, the
+ exception is not propagated and a warning might be emitted to a
+ debugging channel.
+ */
+ public abstract void xStep(sqlite3_context cx, sqlite3_value[] args);
+
+ /**
+ As for the xFinal() argument of the C API's sqlite3_create_function().
+ If this function throws, it is translated into an sqlite3_result_error().
+ */
+ public abstract void xFinal(sqlite3_context cx);
+
+ /**
+ Optionally override to be notified when the UDF is finalized by
+ SQLite.
+ */
+ public void xDestroy() {}
+
+ /** Per-invocation state for the UDF. */
+ private final SQLFunction.PerContextState<T> map =
+ new SQLFunction.PerContextState<>();
+
+ /**
+ To be called from the implementation's xStep() method, as well
+ as the xValue() and xInverse() methods of the Window<T>
+ subclass, to fetch the current per-call UDF state. On the
+ first call to this method for any given sqlite3_context
+ argument, the context is set to the given initial value. On all other
+ calls, the 2nd argument is ignored.
+
+ @see SQLFunction.PerContextState#getAggregateState()
+ */
+ protected final ValueHolder<T> getAggregateState(sqlite3_context cx, T initialValue){
+ return map.getAggregateState(cx, initialValue);
+ }
+
+ /**
+ To be called from the implementation's xFinal() method to fetch
+ the final state of the UDF and remove its mapping.
+
+ see SQLFunction.PerContextState#takeAggregateState()
+ */
+ protected final T takeAggregateState(sqlite3_context cx){
+ return map.takeAggregateState(cx);
+ }
+}
}
}
- /**
- Subclass for creating scalar functions.
- */
- public static abstract class Scalar extends SQLFunction {
-
- /**
- As for the xFunc() argument of the C API's
- sqlite3_create_function(). If this function throws, it is
- translated into an sqlite3_result_error().
- */
- public abstract void xFunc(sqlite3_context cx, sqlite3_value[] args);
-
- /**
- Optionally override to be notified when the UDF is finalized by
- SQLite.
- */
- public void xDestroy() {}
- }
-
- /**
- SQLFunction Subclass for creating aggregate functions. Its T is
- the data type of its "accumulator" state, an instance of which is
- intended to be be managed using the getAggregateState() and
- takeAggregateState() methods.
- */
- public static abstract class Aggregate<T> extends SQLFunction {
-
- /**
- As for the xStep() argument of the C API's
- sqlite3_create_function(). If this function throws, the
- exception is not propagated and a warning might be emitted to a
- debugging channel.
- */
- public abstract void xStep(sqlite3_context cx, sqlite3_value[] args);
-
- /**
- As for the xFinal() argument of the C API's sqlite3_create_function().
- If this function throws, it is translated into an sqlite3_result_error().
- */
- public abstract void xFinal(sqlite3_context cx);
-
- /**
- Optionally override to be notified when the UDF is finalized by
- SQLite.
- */
- public void xDestroy() {}
-
- //! Per-invocation state for the UDF.
- private final PerContextState<T> map = new PerContextState<>();
-
- /**
- To be called from the implementation's xStep() method, as well
- as the xValue() and xInverse() methods of the Window<T>
- subclass, to fetch the current per-call UDF state. On the
- first call to this method for any given sqlite3_context
- argument, the context is set to the given initial value. On all other
- calls, the 2nd argument is ignored.
-
- @see SQLFunction.PerContextState#getAggregateState()
- */
- protected final ValueHolder<T> getAggregateState(sqlite3_context cx, T initialValue){
- return map.getAggregateState(cx, initialValue);
- }
-
- /**
- To be called from the implementation's xFinal() method to fetch
- the final state of the UDF and remove its mapping.
-
- see SQLFunction.PerContextState#takeAggregateState()
- */
- protected final T takeAggregateState(sqlite3_context cx){
- return map.takeAggregateState(cx);
- }
- }
-
- /**
- An SQLFunction subclass for creating window functions. Note that
- Window<T> inherits from Aggregate<T> and each instance is
- required to implement the inherited abstract methods from that
- class. See Aggregate<T> for information on managing the UDF's
- invocation-specific state.
- */
- public static abstract class Window<T> extends Aggregate<T> {
-
- /**
- As for the xInverse() argument of the C API's
- sqlite3_create_window_function(). If this function throws, the
- exception is not propagated and a warning might be emitted
- to a debugging channel.
- */
- public abstract void xInverse(sqlite3_context cx, sqlite3_value[] args);
-
- /**
- As for the xValue() argument of the C API's sqlite3_create_window_function().
- See xInverse() for the fate of any exceptions this throws.
- */
- public abstract void xValue(sqlite3_context cx);
- }
}
sqlite3_create_function_v2(), and
sqlite3_create_window_function(). Which one it behaves like
depends on which methods the final argument implements. See
- SQLFunction's inner classes (Scalar, Aggregate<T>, and Window<T>)
- for details.
- */
+ SQLFunction's subclasses (ScalarFunction, AggregateFunction<T>,
+ and WindowFunction<T>) for details.
+ */
public static native int sqlite3_create_function(
@NotNull sqlite3 db, @NotNull String functionName,
int nArg, int eTextRep, @NotNull SQLFunction func
--- /dev/null
+/*
+** 2023-08-25
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file is part of the JNI bindings for the sqlite3 C API.
+*/
+package org.sqlite.jni;
+
+
+/**
+ SQLFunction subclass for creating scalar functions.
+*/
+public abstract class ScalarFunction extends SQLFunction {
+ /**
+ As for the xFunc() argument of the C API's
+ sqlite3_create_function(). If this function throws, it is
+ translated into an sqlite3_result_error().
+ */
+ public abstract void xFunc(sqlite3_context cx, sqlite3_value[] args);
+
+ /**
+ Optionally override to be notified when the UDF is finalized by
+ SQLite.
+ */
+ public void xDestroy() {}
+}
// Each of the 3 subclasses requires a different set of
// functions, all of which must be implemented. Anonymous
// classes are a convenient way to implement these.
- new SQLFunction.Scalar(){
+ new ScalarFunction(){
public void xFunc(sqlite3_context cx, sqlite3_value[] args){
affirm(db == sqlite3_context_db_handle(cx));
int result = 0;
final sqlite3 db = createNewDb();
final ValueHolder<Integer> xFuncAccum = new ValueHolder<>(0);
- SQLFunction funcAgg = new SQLFunction.Aggregate<Integer>(){
+ SQLFunction funcAgg = new AggregateFunction<Integer>(){
@Override public void xStep(sqlite3_context cx, sqlite3_value[] args){
/** Throwing from here should emit loud noise on stdout or stderr
but the exception is supressed because we have no way to inform
affirm( 0 != rc );
affirm( sqlite3_errmsg(db).indexOf("an xFinal") > 0 );
- SQLFunction funcSc = new SQLFunction.Scalar(){
+ SQLFunction funcSc = new ScalarFunction(){
@Override public void xFunc(sqlite3_context cx, sqlite3_value[] args){
throw new RuntimeException("Throwing from an xFunc");
}
private void testUdfJavaObject(){
final sqlite3 db = createNewDb();
final ValueHolder<sqlite3> testResult = new ValueHolder<>(db);
- final SQLFunction func = new SQLFunction.Scalar(){
+ final SQLFunction func = new ScalarFunction(){
public void xFunc(sqlite3_context cx, sqlite3_value args[]){
sqlite3_result_java_object(cx, testResult.value);
}
// To confirm that xFinal() is called with no aggregate state
// when the corresponding result set is empty.
new ValueHolder<>(false);
- SQLFunction func = new SQLFunction.Aggregate<Integer>(){
+ SQLFunction func = new AggregateFunction<Integer>(){
@Override
public void xStep(sqlite3_context cx, sqlite3_value[] args){
final ValueHolder<Integer> agg = this.getAggregateState(cx, 0);
final sqlite3 db = createNewDb();
/* Example window function, table, and results taken from:
https://sqlite.org/windowfunctions.html#udfwinfunc */
- final SQLFunction func = new SQLFunction.Window<Integer>(){
+ final SQLFunction func = new WindowFunction<Integer>(){
private void xStepInverse(sqlite3_context cx, int v){
this.getAggregateState(cx,0).value += v;
--- /dev/null
+/*
+** 2023-08-25
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file is part of the JNI bindings for the sqlite3 C API.
+*/
+package org.sqlite.jni;
+
+
+/**
+ An SQLFunction subclass for creating window functions. Note that
+ Window<T> inherits from Aggregate<T> and each instance is
+ required to implement the inherited abstract methods from that
+ class. See Aggregate<T> for information on managing the UDF's
+ invocation-specific state.
+*/
+public abstract class WindowFunction<T> extends AggregateFunction<T> {
+
+ /**
+ As for the xInverse() argument of the C API's
+ sqlite3_create_window_function(). If this function throws, the
+ exception is not propagated and a warning might be emitted
+ to a debugging channel.
+ */
+ public abstract void xInverse(sqlite3_context cx, sqlite3_value[] args);
+
+ /**
+ As for the xValue() argument of the C API's sqlite3_create_window_function().
+ See xInverse() for the fate of any exceptions this throws.
+ */
+ public abstract void xValue(sqlite3_context cx);
+}
-C Missed\sa\sstraggler\swhen\srenaming\sJava\sclasses\sin\s[8ca528006533ac1].\sDocument\sthreading\slimitations.
-D 2023-08-25T16:26:16.517
+C Move\sthe\s3\sJava\sSQLFunction\ssubclasses\sfrom\sinner\sclasses\sto\spackage\sscope.
+D 2023-08-25T16:43:51.353
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
F ext/icu/README.txt 7ab7ced8ae78e3a645b57e78570ff589d4c672b71370f5aa9e1cd7024f400fc9
F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282
F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8
-F ext/jni/GNUmakefile 4fed859fb183595826e02213761b361c40d2f43959f0f119d322738892c29357
+F ext/jni/GNUmakefile b28f8b304ef97db8250857cb463aea1b329bfcb584a2902d4c1a490a831e2c9d
F ext/jni/README.md 1332b1fa27918bd5d9ca2d0d4f3ac3a6ab86b9e3699dc5bfe32904a027f3d2a9
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
F ext/jni/src/c/sqlite3-jni.c 29c10d96f81361b0d121e389320a1dd57958fd758e3790817542d2eb20c42bed
F ext/jni/src/c/sqlite3-jni.h 2745c4abd0933a4e8cc48989fffbad3936b4eaada64cce9ce11453dcd30e4184
+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/BusyHandlerCallback.java 99248b76e9b124f60a25329309ac6a03c197b3e1a493e8f8ae2e577651ea58e5
-F ext/jni/src/org/sqlite/jni/CollationCallback.java 4391351e10f26ca61e9c461f969c12f36e0146e50a8c5b66ff549142bbf41f64 w ext/jni/src/org/sqlite/jni/Collation.java
+F ext/jni/src/org/sqlite/jni/CollationCallback.java 4391351e10f26ca61e9c461f969c12f36e0146e50a8c5b66ff549142bbf41f64
F ext/jni/src/org/sqlite/jni/CollationNeededCallback.java b2adbe0cb41b67bcb638885e00950abe0265e885326a96451f6ab114fb11ef59
F ext/jni/src/org/sqlite/jni/CommitHookCallback.java c2b4deec20acf9c72ab487ba1a408c54cb5cc12c45baa46490b555b80bd3579f
F ext/jni/src/org/sqlite/jni/ConfigSqllogCallback.java e3656909eab7ed0f7e457c5b82df160ca22dd5e954c0a306ec1fca61b0d266b4
F ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java 7c46660c6b07a765a3f053ae06a10d7ccb4966b49979143d605a3bfb4f14f806
F ext/jni/src/org/sqlite/jni/ResultCode.java ba701f20213a5f259e94cfbfdd36eb7ac7ce7797f2c6c7fca2004ff12ce20f86
F ext/jni/src/org/sqlite/jni/RollbackHookCallback.java be7f7a26d1102fb514d835e11198d51302af8053d97188bfb2e34c2133208568
-F ext/jni/src/org/sqlite/jni/SQLFunction.java f6842d587c6366d4ebd565b533a288efc978d56ab2d4f52f2e74b64c8e6a33f3
+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 17aebe15820b525678839c5e12160a7ca77b1691e59c8fb7c08b05757bea9553
-F ext/jni/src/org/sqlite/jni/Tester1.java 882755ac7a437ecde721084a0839b524199fa9857a7878d16a20848a7187093f
+F ext/jni/src/org/sqlite/jni/SQLite3Jni.java cb3040fcfe35199bb10b4bca2cc541ca383563f85c9b460412c3bd15f413ae23
+F ext/jni/src/org/sqlite/jni/ScalarFunction.java 21301a947e49f0dd9c682dfe2cc8a6518226c837253dd791cd512f847eeca52c
+F ext/jni/src/org/sqlite/jni/Tester1.java 1a9c6c8252d854398e37f5e4f8d9f66de0fd4767e60e43af26f4fdc681fab8b9
F ext/jni/src/org/sqlite/jni/TesterFts5.java 6f135c60e24c89e8eecb9fe61dde0f3bb2906de668ca6c9186bcf34bdaf94629
F ext/jni/src/org/sqlite/jni/TraceV2Callback.java 25a45e800b0c57f506c237d111bcfd09da584e936fee395d4bd802100ebeff8c
F ext/jni/src/org/sqlite/jni/UpdateHookCallback.java f5eadfa44462c050658230884b41477274f34306accd85c8201a7afbc00d2429
F ext/jni/src/org/sqlite/jni/ValueHolder.java f022873abaabf64f3dd71ab0d6037c6e71cece3b8819fa10bf26a5461dc973ee
+F ext/jni/src/org/sqlite/jni/WindowFunction.java 3e24a0f2615f9a232b1ecbb3f243b05dd7c007dc43be238499af93a459fe8253
F ext/jni/src/org/sqlite/jni/XDestroyCallback.java a43c6fad4d550c40d7ad2545565dd794df68aae855a7a6fe2d5f57ccbfc0e7d6
F ext/jni/src/org/sqlite/jni/fts5_api.java 5198be71c162e3e0cb1f4962a7cdf0d7596e8af53f70c4af6db24aab8d53d9ba
F ext/jni/src/org/sqlite/jni/fts5_extension_function.java ac825035d7d83fc7fd960347abfa6803e1614334a21533302041823ad5fc894c
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 8ca528006533ac152e9b322e421cf5d339414c77332d9836a9ff429b793d0d2d
-R 5885805208dd5a9cb4303aef998be394
+P 5786b95f5d09b4462aff0fdeac37992a2b64c47b004d18960f51e4e6a5796106
+R 7f0497e9841cedff7936a9c02791fa84
U stephan
-Z 3728ae49651cf5a3340c3d5aa589c6ef
+Z 3ac21aead20aa0563125716a8691ad77
# Remove this line to create a well-formed Fossil manifest.
-5786b95f5d09b4462aff0fdeac37992a2b64c47b004d18960f51e4e6a5796106
\ No newline at end of file
+21fd47a68db9df1828f4cc4131d326a193b5751d56a40ae77ed0a78dc0621af1
\ No newline at end of file