From: stephan Date: Sun, 3 Sep 2023 14:41:13 +0000 (+0000) Subject: Add the missing sqlite3_blob_read() to [9a9945c405cf]. Elaborate on the definition... X-Git-Tag: version-3.44.0~216^2~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=14412e952678d505ca27a8f89ae4bb85503e398e;p=thirdparty%2Fsqlite.git Add the missing sqlite3_blob_read() to [9a9945c405cf]. Elaborate on the definition of the @NotNull annotation. FossilOrigin-Name: 85952b4a52a09e9da35754c1a1ec70b1bf277296011a2d37ac536b33437223d7 --- diff --git a/ext/jni/src/c/sqlite3-jni.c b/ext/jni/src/c/sqlite3-jni.c index 720de5c56f..f7e614f4d2 100644 --- a/ext/jni/src/c/sqlite3-jni.c +++ b/ext/jni/src/c/sqlite3-jni.c @@ -2483,6 +2483,24 @@ S3JniApi(sqlite3_blob_open(),jint,1blob_1open)( return rc; } +S3JniApi(sqlite3_blob_read(),jint,1blob_1read)( + JniArgsEnvClass, jobject jBlob, jbyteArray jTgt, jint iOffset +){ + jbyte * const pBa = s3jni_jbyteArray_bytes(jTgt); + int rc = jTgt ? (pBa ? SQLITE_MISUSE : SQLITE_NOMEM) : SQLITE_MISUSE; + if( pBa ){ + jsize const nTgt = (*env)->GetArrayLength(env, jTgt); + rc = sqlite3_blob_read(PtrGet_sqlite3_blob(jBlob), pBa, + (int)nTgt, (int)iOffset); + if( 0==rc ){ + s3jni_jbyteArray_commit(jTgt, pBa); + }else{ + s3jni_jbyteArray_release(jTgt, pBa); + } + } + return rc; +} + S3JniApi(sqlite3_blob_reopen(),jint,1blob_1reopen)( JniArgsEnvClass, jobject jBlob, jlong iNewRowId ){ diff --git a/ext/jni/src/c/sqlite3-jni.h b/ext/jni/src/c/sqlite3-jni.h index 91d512205f..08de9ab8a6 100644 --- a/ext/jni/src/c/sqlite3-jni.h +++ b/ext/jni/src/c/sqlite3-jni.h @@ -971,6 +971,14 @@ JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1blob_1close JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1blob_1open (JNIEnv *, jclass, jobject, jstring, jstring, jstring, jlong, jint, jobject); +/* + * Class: org_sqlite_jni_SQLite3Jni + * Method: sqlite3_blob_read + * Signature: (Lorg/sqlite/jni/sqlite3_blob;[BI)I + */ +JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1blob_1read + (JNIEnv *, jclass, jobject, jbyteArray, jint); + /* * Class: org_sqlite_jni_SQLite3Jni * Method: sqlite3_blob_reopen diff --git a/ext/jni/src/org/sqlite/jni/SQLite3Jni.java b/ext/jni/src/org/sqlite/jni/SQLite3Jni.java index 407b5dfbd6..26b027160a 100644 --- a/ext/jni/src/org/sqlite/jni/SQLite3Jni.java +++ b/ext/jni/src/org/sqlite/jni/SQLite3Jni.java @@ -367,6 +367,11 @@ public final class SQLite3Jni { return out.take(); }; + @Canonical + public static native int sqlite3_blob_read( + @NotNull sqlite3_blob b, @NotNull byte[] target, int iOffset + ); + @Canonical public static native int sqlite3_blob_reopen( @NotNull sqlite3_blob out, long newRowId @@ -374,8 +379,7 @@ public final class SQLite3Jni { @Canonical public static native int sqlite3_blob_write( - @NotNull sqlite3_blob out, @NotNull byte[] bytes, - int iOffset + @NotNull sqlite3_blob out, @NotNull byte[] bytes, int iOffset ); /** diff --git a/ext/jni/src/org/sqlite/jni/Tester1.java b/ext/jni/src/org/sqlite/jni/Tester1.java index 409418bf60..2987c1b85a 100644 --- a/ext/jni/src/org/sqlite/jni/Tester1.java +++ b/ext/jni/src/org/sqlite/jni/Tester1.java @@ -1541,26 +1541,40 @@ public class Tester1 implements Runnable { final sqlite3 db = createNewDb(); execSql(db, "CREATE TABLE T(a BLOB);" - +"INSERT INTO t(a) VALUES(cast('DEF' as text));"); + +"INSERT INTO t(rowid,a) VALUES(1, 'def'),(2, 'XYZ');" + ); final OutputPointer.sqlite3_blob pOut = new OutputPointer.sqlite3_blob(); int rc = sqlite3_blob_open(db, "main", "t", "a", sqlite3_last_insert_rowid(db), 1, pOut); affirm( 0==rc ); - final sqlite3_blob b = pOut.take(); + sqlite3_blob b = pOut.take(); affirm( null!=b ); affirm( 0!=b.getNativePointer() ); affirm( 3==sqlite3_blob_bytes(b) ); - rc = sqlite3_blob_write( b, new byte[] {100, 101, 102}, 0); + rc = sqlite3_blob_write( b, new byte[] {100, 101, 102 /*"DEF"*/}, 0); affirm( 0==rc ); rc = sqlite3_blob_close(b); affirm( 0==rc ); + rc = sqlite3_blob_close(b); + affirm( 0!=rc ); affirm( 0==b.getNativePointer() ); - sqlite3_stmt stmt = prepare(db,"SELECT length(a), a FROM t"); + sqlite3_stmt stmt = prepare(db,"SELECT length(a), a FROM t ORDER BY a"); affirm( SQLITE_ROW == sqlite3_step(stmt) ); affirm( 3 == sqlite3_column_int(stmt,0) ); affirm( "def".equals(sqlite3_column_text16(stmt,1)) ); - sqlite3_finalize(stmt); + + b = sqlite3_blob_open(db, "main", "t", "a", + sqlite3_last_insert_rowid(db), 1); + affirm( null!=b ); + rc = sqlite3_blob_reopen(b, 2); + affirm( 0==rc ); + final byte[] tgt = new byte[3]; + rc = sqlite3_blob_read(b, tgt, 0); + affirm( 0==rc ); + affirm( 100==tgt[0] && 101==tgt[1] && 102==tgt[2], "DEF" ); + rc = sqlite3_blob_close(b); + affirm( 0==rc ); sqlite3_close_v2(db); } diff --git a/ext/jni/src/org/sqlite/jni/annotation/NotNull.java b/ext/jni/src/org/sqlite/jni/annotation/NotNull.java index 99eae7370a..060846ff39 100644 --- a/ext/jni/src/org/sqlite/jni/annotation/NotNull.java +++ b/ext/jni/src/org/sqlite/jni/annotation/NotNull.java @@ -6,19 +6,22 @@ package org.sqlite.jni.annotation; called into from the C APIs, this annotation communicates that the C API will never pass a null value to the callback. +

Passing a null for any parameter marked with this annoation + specifically invokes undefined behavior.

+

Note that the C-style API does not throw any exceptions on its own because it has a no-throw policy in order to retain its C-style semantics, but it may trigger NullPointerExceptions (or similar) if - passed a null for a parameter flagged with this annotation. + passed a null for a parameter flagged with this annotation.

This annotation is informational only. No policy is in place to programmatically ensure that NotNull is conformed to in client - code. + code.

This annotation is solely for the use by the classes in this package but is made public so that javadoc will link to it from the annotated functions. It is not part of the public API and - client-level code must not rely on it. + client-level code must not rely on it.

*/ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) diff --git a/manifest b/manifest index daa9e58d18..e5562b0cb1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Expose\sthe\ssqlite3_blob_...()\sAPIs\sto\sJNI. -D 2023-09-03T14:13:29.255 +C Add\sthe\smissing\ssqlite3_blob_read()\sto\s[9a9945c405cf].\sElaborate\son\sthe\sdefinition\sof\sthe\s@NotNull\sannotation. +D 2023-09-03T14:41:13.037 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -237,8 +237,8 @@ F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a3 F ext/jni/GNUmakefile 7bd7f0c28d664b71b08f9d8ff507eb8329f1f3e7b5d88f774f90a1a5259a3fe8 F ext/jni/README.md 1332b1fa27918bd5d9ca2d0d4f3ac3a6ab86b9e3699dc5bfe32904a027f3d2a9 F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa -F ext/jni/src/c/sqlite3-jni.c 2a5a3f6637d34c3d8e8d60eac00b8ca231b0e97ce170d44c60a3afd040301104 -F ext/jni/src/c/sqlite3-jni.h 273e2ab8652d438e98bc891c8a80dcb4f9de82675124f0b090927532d8c5d212 +F ext/jni/src/c/sqlite3-jni.c 13ad7ddb42fb3733edef89ae0ed39b73ac0ceb2b25b53aac2533321544987e7a +F ext/jni/src/c/sqlite3-jni.h 72e2e16143bebce663e8b62a4878ad97e30de74e40cdd19415a31ee9a859ddd6 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/AuthorizerCallback.java e6135be32f12bf140bffa39be7fd1a45ad83b2661ed49c08dbde04c8485feb38 @@ -262,10 +262,10 @@ F ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java 7b9ff2218129ece98ba60c F ext/jni/src/org/sqlite/jni/ResultCode.java ba701f20213a5f259e94cfbfdd36eb7ac7ce7797f2c6c7fca2004ff12ce20f86 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/SQLite3Jni.java 5b8890dcee68dda59c737a2e5acf34ae251b088daa1159f0a5cd78a087439239 +F ext/jni/src/org/sqlite/jni/SQLite3Jni.java b9b45b3434141c51e827483ea88b676cb5287c1376809eb8ebc9931a9a4357d2 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/Tester1.java 1f38d134b732f0122ff7eace6945fa7093afe264fc158eebf66d193cba6ed294 +F ext/jni/src/org/sqlite/jni/Tester1.java 1d59c877ce795916f57c0f741b09666b801b22b5509f725c9b96fc07bc75afcd F ext/jni/src/org/sqlite/jni/TesterFts5.java 1d127690daac4751300b277a14c09faa0cefd1efa365580cd8d95ea658e1ee59 F ext/jni/src/org/sqlite/jni/TraceV2Callback.java beb0b064c1a5f8bfe585a324ed39a4e33edbe379a3fc60f1401661620d3ca7c0 F ext/jni/src/org/sqlite/jni/UpdateHookCallback.java 8376f4a931f2d5612b295c003c9515ba933ee76d8f95610e89c339727376e36c @@ -273,7 +273,7 @@ F ext/jni/src/org/sqlite/jni/ValueHolder.java f022873abaabf64f3dd71ab0d6037c6e71 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/annotation/Canonical.java 2767daa5b3893b96729db80a0f8234d379d266d1b2c21400a057864b538a0ea5 -F ext/jni/src/org/sqlite/jni/annotation/NotNull.java d48ebd7ae6bbb78bd47d54431c85e1521c89b1d3864a2b6eafd9c0e1b2341457 +F ext/jni/src/org/sqlite/jni/annotation/NotNull.java cdfd375b3451333e276631ba049e8a5937695752973cb108313d917a31533423 F ext/jni/src/org/sqlite/jni/annotation/Nullable.java 6f962a98c9a5c6e9d21c50ae8716b16bdfdc934a191608cbb7e12ea588ddb6af F ext/jni/src/org/sqlite/jni/annotation/package-info.java f66bfb621c6494e67c03ed38a9e26a3bd6af99b9f9f6ef79556bcec30a025a22 F ext/jni/src/org/sqlite/jni/fts5_api.java bf7009a7fd2d11a77280380e6e2c7f98e377494b3f265e50fc44cbb9a24275d9 @@ -2118,8 +2118,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 bac54da29c19ef5e0a76599b5d10b377ecd7b391a651af99526529df16a83c7d -R 282c1de5bd907fe2a4768bc91d128cea +P 9a9945c405cfe9b6bf399655f498457da66b06c8b92014510ab9fb83fbb1c7d4 +R 84372103f945861eb05bc4b3a5468361 U stephan -Z eef925f2110921290c9a3b0a29c51189 +Z c5aa39a6231129353b30e801e81c87f0 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f88732c20e..11cb864f5f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9a9945c405cfe9b6bf399655f498457da66b06c8b92014510ab9fb83fbb1c7d4 \ No newline at end of file +85952b4a52a09e9da35754c1a1ec70b1bf277296011a2d37ac536b33437223d7 \ No newline at end of file