int rc = SQLITE_MISUSE;
if(pStmt){
- jobject const rv = val ? S3JniRefGlobal(val) : 0;
+ jobject const rv = S3JniRefGlobal(val);
if( rv ){
rc = sqlite3_bind_pointer(pStmt, ndx, rv, ResultJavaValuePtrStr,
S3Jni_jobject_finalizer);
return (jint)rc;
}
+S3JniApi(sqlite3_bind_value(),jint,1bind_1value)(
+ JniArgsEnvClass, jlong jpStmt, jint ndx, jlong jpValue
+){
+ int rc = 0;
+ sqlite3_stmt * pStmt = S3JniLongPtr_sqlite3_stmt(jpStmt);
+ if( pStmt ){
+ sqlite3_value *v = S3JniLongPtr_sqlite3_value(jpValue);
+ if( v ){
+ rc = sqlite3_bind_value(pStmt, (int)ndx, v);
+ }else{
+ sqlite3_bind_null(pStmt, (int)ndx);
+ }
+ }else{
+ rc = SQLITE_MISUSE;
+ }
+ return (jint)rc;
+}
+
S3JniApi(sqlite3_bind_zeroblob(),jint,1bind_1zeroblob)(
JniArgsEnvClass, jlong jpStmt, jint ndx, jint n
){
sqlite3_stmt * pStmt = 0;
jobject jStmt = 0;
const char * zTail = 0;
- jbyte * const pBuf = s3jni_jbyteArray_bytes(baSql);
+ sqlite3 * const pDb = S3JniLongPtr_sqlite3(jpDb);
+ jbyte * const pBuf = pDb ? s3jni_jbyteArray_bytes(baSql) : 0;
int rc = SQLITE_ERROR;
+
assert(prepVersion==1 || prepVersion==2 || prepVersion==3);
- if( !pBuf ){
+ if( !pDb || !jOutStmt ){
+ rc = SQLITE_MISUSE;
+ goto end;
+ }else if( !pBuf ){
rc = baSql ? SQLITE_NOMEM : SQLITE_MISUSE;
goto end;
}
goto end;
}
switch( prepVersion ){
- case 1: rc = sqlite3_prepare(S3JniLongPtr_sqlite3(jpDb), (const char *)pBuf,
+ case 1: rc = sqlite3_prepare(pDb, (const char *)pBuf,
(int)nMax, &pStmt, &zTail);
break;
- case 2: rc = sqlite3_prepare_v2(S3JniLongPtr_sqlite3(jpDb), (const char *)pBuf,
+ case 2: rc = sqlite3_prepare_v2(pDb, (const char *)pBuf,
(int)nMax, &pStmt, &zTail);
break;
- case 3: rc = sqlite3_prepare_v3(S3JniLongPtr_sqlite3(jpDb), (const char *)pBuf,
+ case 3: rc = sqlite3_prepare_v3(pDb, (const char *)pBuf,
(int)nMax, (unsigned int)prepFlags,
&pStmt, &zTail);
break;
S3JniUnrefLocal(jStmt);
jStmt = 0;
}
- OutputPointer_set_obj(env, S3JniNph(OutputPointer_sqlite3_stmt),
- jOutStmt, jStmt);
+ if( jOutStmt ){
+ OutputPointer_set_obj(env, S3JniNph(OutputPointer_sqlite3_stmt),
+ jOutStmt, jStmt);
+ }
return (jint)rc;
}
S3JniApi(sqlite3_prepare(),jint,1prepare)(
JNIEnv * const env, sqlite3_context *pCx,
jbyteArray jBa, jlong nMax){
int const asBlob = 0==eTextRep;
- if( jBa ){
+ if( !pCx ){
+ /* We should arguably emit a warning here. But where to log it? */
+ return;
+ }else if( jBa ){
jbyte * const pBuf = s3jni_jbyteArray_bytes(jBa);
jsize nBa = (*env)->GetArrayLength(env, jBa);
if( nMax>=0 && nBa>(jsize)nMax ){
Note that the text64() interfaces take an unsigned value for
the length, which Java does not support. This binding takes
the approach of passing on negative values to the C API,
- which will, in turn fail with SQLITE_TOOBIG at some later
+ which will in turn fail with SQLITE_TOOBIG at some later
point (recall that the sqlite3_result_xyz() family do not
have result values).
*/
S3JniApi(sqlite3_result_java_object(),void,1result_1java_1object)(
JniArgsEnvClass, jobject jpCx, jobject v
){
- if( v ){
+ sqlite3_context * pCx = PtrGet_sqlite3_context(jpCx);
+ if( !pCx ) return;
+ else if( v ){
jobject const rjv = S3JniRefGlobal(v);
if( rjv ){
- sqlite3_result_pointer(PtrGet_sqlite3_context(jpCx), rjv,
+ sqlite3_result_pointer(pCx, rjv,
ResultJavaValuePtrStr, S3Jni_jobject_finalizer);
}else{
sqlite3_result_error_nomem(PtrGet_sqlite3_context(jpCx));
: sqlite3_bind_text16(stmt.getNativePointer(), ndx, data, data.length);
}
+ static native int sqlite3_bind_value(@NotNull long ptrToStmt, int ndx, long ptrToValue);
+
+ /**
+ Functions like the C-level sqlite3_bind_value(), or
+ sqlite3_bind_null() if val is null.
+ */
+ public static int sqlite3_bind_value(@NotNull sqlite3_stmt stmt, int ndx, sqlite3_value val){
+ return sqlite3_bind_value(stmt.getNativePointer(), ndx,
+ null==val ? 0L : val.getNativePointer());
+ }
+
static native int sqlite3_bind_zeroblob(@NotNull long ptrToStmt, int ndx, int n);
public static int sqlite3_bind_zeroblob(@NotNull sqlite3_stmt stmt, int ndx, int n){
-C Add\sAPI_ARMOR\ssupport\sto\sthe\ssqlite3_result_...()\sfamily\sof\sfunctions\sand\ssqlite3_bind_zeroblob64().
-D 2023-10-14T16:29:36.931
+C JNI:\sadd\smissing\ssqlite3_bind_value()\sand\sminor\smemory-safety-related\scleanups.
+D 2023-10-14T16:56:12.307
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
F ext/jni/GNUmakefile 6da240c9a11701f3ed569384cd15ef611e8b3c5e3897d265923b14bf0e1eb272
F ext/jni/README.md ef9ac115e97704ea995d743b4a8334e23c659e5534c3b64065a5405256d5f2f4
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
-F ext/jni/src/c/sqlite3-jni.c 3d4640ae9c128326e0f65dade4732734771596371e398a7ae95c4d33ef24928a
-F ext/jni/src/c/sqlite3-jni.h 8bd34a6fe3b51059690be31ac5bd6e454a738dd1ff9916f490e05cf63c4f8e37
+F ext/jni/src/c/sqlite3-jni.c fdaad9490dad7b703dcfc98cda1c9a9e82b1bf8e6d9f6b64dd1639878f990f7c
+F ext/jni/src/c/sqlite3-jni.h fefcf0a7116d0c0f097c7ac71ca9ab4d092bf661ac40dd9dafb415d929f9b26d
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 fde5f758ad170ca45ae00b12194c8ba8d8f3090bd64cc3e002dd9c5e7dff8568
F ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java c0fbfd3779fc92982c7935325a7484dee43eeb80d716989ed31218f453addb94
F ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java 4cb7fc70efd55583fed6033c34a8719da42975ca97ef4781dda0b9f6cc8ec2e8
-F ext/jni/src/org/sqlite/jni/CApi.java 6f878d291642568a06d9a36c15b420f5f867dcc44cee0cc56e8f02b542f67ec4
+F ext/jni/src/org/sqlite/jni/CApi.java 32dcd13be87308fbd98f07cb6f6c25ece21ccb17b5fb9ff81e4c6e574758db0e
F ext/jni/src/org/sqlite/jni/CallbackProxy.java 064a8a00e4c63cc501c30504f93ca996d422c5f010067f969b2d0a10f0868153
F ext/jni/src/org/sqlite/jni/CollationCallback.java 8cf57cb014a645ecc12609eed17308852a597bc5e83d82a4fdb90f7fadc25f9d
F ext/jni/src/org/sqlite/jni/CollationNeededCallback.java 0c62245e000d5db52576c728cac20f6a31f31f5cf40ca4cbcd64b22964e82ae5
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 78ebf838f645742f87733665cd72af736df345683b27377a2c8310c893b1769d
-R 71ff5d4a376fdfcdde5b2514a89cbed8
+P afabe3e35a66625527e2881749cdb6e13300888ab57bc0f05889d0e3ee203d73
+R e2e3f6e590cd006da1a4ca6fd58b6f1a
U stephan
-Z 2c334c3835eed2b31940cc452708383c
+Z e96ab04282e03aa20daa6385e63d9a19
# Remove this line to create a well-formed Fossil manifest.