From 25033b6b3b888e493a724007080001e45291601b Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 25 Aug 2023 16:43:51 +0000 Subject: [PATCH] Move the 3 Java SQLFunction subclasses from inner classes to package scope. FossilOrigin-Name: 21fd47a68db9df1828f4cc4131d326a193b5751d56a40ae77ed0a78dc0621af1 --- ext/jni/GNUmakefile | 7 ++ .../src/org/sqlite/jni/AggregateFunction.java | 72 ++++++++++++++ ext/jni/src/org/sqlite/jni/SQLFunction.java | 98 ------------------- ext/jni/src/org/sqlite/jni/SQLite3Jni.java | 6 +- .../src/org/sqlite/jni/ScalarFunction.java | 33 +++++++ ext/jni/src/org/sqlite/jni/Tester1.java | 12 +-- .../src/org/sqlite/jni/WindowFunction.java | 39 ++++++++ manifest | 23 +++-- manifest.uuid | 2 +- 9 files changed, 174 insertions(+), 118 deletions(-) create mode 100644 ext/jni/src/org/sqlite/jni/AggregateFunction.java create mode 100644 ext/jni/src/org/sqlite/jni/ScalarFunction.java create mode 100644 ext/jni/src/org/sqlite/jni/WindowFunction.java diff --git a/ext/jni/GNUmakefile b/ext/jni/GNUmakefile index 2ee9389b81..7534166335 100644 --- a/ext/jni/GNUmakefile +++ b/ext/jni/GNUmakefile @@ -59,6 +59,7 @@ $(bin.version-info): $(dir.tool)/version-info.c $(sqlite3.h) $(dir.top)/Makefile # 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 \ @@ -74,12 +75,14 @@ JAVA_FILES.main := $(patsubst %,$(dir.src.jni)/%,\ 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 \ @@ -318,6 +321,10 @@ $(doc.index): $(JAVA_FILES.main) $(MAKEFILE) .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 ######################################################################## diff --git a/ext/jni/src/org/sqlite/jni/AggregateFunction.java b/ext/jni/src/org/sqlite/jni/AggregateFunction.java new file mode 100644 index 0000000000..6b6c848763 --- /dev/null +++ b/ext/jni/src/org/sqlite/jni/AggregateFunction.java @@ -0,0 +1,72 @@ +/* +** 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 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 map = + new SQLFunction.PerContextState<>(); + + /** + To be called from the implementation's xStep() method, as well + as the xValue() and xInverse() methods of the Window + 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 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); + } +} diff --git a/ext/jni/src/org/sqlite/jni/SQLFunction.java b/ext/jni/src/org/sqlite/jni/SQLFunction.java index c8b15d8b68..badbc3dc78 100644 --- a/ext/jni/src/org/sqlite/jni/SQLFunction.java +++ b/ext/jni/src/org/sqlite/jni/SQLFunction.java @@ -100,102 +100,4 @@ public abstract class SQLFunction { } } - /** - 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 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 map = new PerContextState<>(); - - /** - To be called from the implementation's xStep() method, as well - as the xValue() and xInverse() methods of the Window - 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 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 inherits from Aggregate and each instance is - required to implement the inherited abstract methods from that - class. See Aggregate for information on managing the UDF's - invocation-specific state. - */ - public static abstract class Window extends Aggregate { - - /** - 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); - } } diff --git a/ext/jni/src/org/sqlite/jni/SQLite3Jni.java b/ext/jni/src/org/sqlite/jni/SQLite3Jni.java index 7b19c5dc72..6c1ec796db 100644 --- a/ext/jni/src/org/sqlite/jni/SQLite3Jni.java +++ b/ext/jni/src/org/sqlite/jni/SQLite3Jni.java @@ -519,9 +519,9 @@ public final class SQLite3Jni { 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, and Window) - for details. - */ + SQLFunction's subclasses (ScalarFunction, AggregateFunction, + and WindowFunction) for details. + */ public static native int sqlite3_create_function( @NotNull sqlite3 db, @NotNull String functionName, int nArg, int eTextRep, @NotNull SQLFunction func diff --git a/ext/jni/src/org/sqlite/jni/ScalarFunction.java b/ext/jni/src/org/sqlite/jni/ScalarFunction.java new file mode 100644 index 0000000000..9d75dbdb76 --- /dev/null +++ b/ext/jni/src/org/sqlite/jni/ScalarFunction.java @@ -0,0 +1,33 @@ +/* +** 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() {} +} diff --git a/ext/jni/src/org/sqlite/jni/Tester1.java b/ext/jni/src/org/sqlite/jni/Tester1.java index 3af676394d..5d3712f2d6 100644 --- a/ext/jni/src/org/sqlite/jni/Tester1.java +++ b/ext/jni/src/org/sqlite/jni/Tester1.java @@ -612,7 +612,7 @@ public class Tester1 implements Runnable { // 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; @@ -648,7 +648,7 @@ public class Tester1 implements Runnable { final sqlite3 db = createNewDb(); final ValueHolder xFuncAccum = new ValueHolder<>(0); - SQLFunction funcAgg = new SQLFunction.Aggregate(){ + SQLFunction funcAgg = new AggregateFunction(){ @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 @@ -668,7 +668,7 @@ public class Tester1 implements Runnable { 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"); } @@ -689,7 +689,7 @@ public class Tester1 implements Runnable { private void testUdfJavaObject(){ final sqlite3 db = createNewDb(); final ValueHolder 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); } @@ -721,7 +721,7 @@ public class Tester1 implements Runnable { // 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(){ + SQLFunction func = new AggregateFunction(){ @Override public void xStep(sqlite3_context cx, sqlite3_value[] args){ final ValueHolder agg = this.getAggregateState(cx, 0); @@ -787,7 +787,7 @@ public class Tester1 implements Runnable { final sqlite3 db = createNewDb(); /* Example window function, table, and results taken from: https://sqlite.org/windowfunctions.html#udfwinfunc */ - final SQLFunction func = new SQLFunction.Window(){ + final SQLFunction func = new WindowFunction(){ private void xStepInverse(sqlite3_context cx, int v){ this.getAggregateState(cx,0).value += v; diff --git a/ext/jni/src/org/sqlite/jni/WindowFunction.java b/ext/jni/src/org/sqlite/jni/WindowFunction.java new file mode 100644 index 0000000000..c083312f24 --- /dev/null +++ b/ext/jni/src/org/sqlite/jni/WindowFunction.java @@ -0,0 +1,39 @@ +/* +** 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 inherits from Aggregate and each instance is + required to implement the inherited abstract methods from that + class. See Aggregate for information on managing the UDF's + invocation-specific state. +*/ +public abstract class WindowFunction extends AggregateFunction { + + /** + 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); +} diff --git a/manifest b/manifest index 9640199ae7..99bb002623 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -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 @@ -233,15 +233,16 @@ F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c 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 @@ -259,14 +260,16 @@ F ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java 8925c58797a90caeb4a7728a 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 @@ -2100,8 +2103,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 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. diff --git a/manifest.uuid b/manifest.uuid index 7f7db679d9..9e2cd43c62 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5786b95f5d09b4462aff0fdeac37992a2b64c47b004d18960f51e4e6a5796106 \ No newline at end of file +21fd47a68db9df1828f4cc4131d326a193b5751d56a40ae77ed0a78dc0621af1 \ No newline at end of file