JDECL(jstring,1compileoption_1get)(JENV_CSELF, jint n){
- return (*env)->NewStringUTF( env, sqlite3_compileoption_get(n) );
+ return (*env)->NewStringUTF( env, sqlite3_compileoption_get(n) )
+ /* We know these to be ASCII, so MUTF-8 is fine. */;
}
JDECL(jboolean,1compileoption_1used)(JENV_CSELF, jstring name){
JDECL(jstring,1db_1filename)(JENV_CSELF, jobject jDb, jstring jDbName){
S3JniDb * const ps = S3JniDb_for_db(env, jDb, 0);
- S3JniEnv * const jc = S3JniGlobal_env_cache(env);
+ S3JniEnv * const jc = ps ? S3JniGlobal_env_cache(env) : 0;
char *zDbName;
jstring jRv = 0;
int nStr = 0;
const char*z2,const char*z3){
S3JniDb * const ps = pState;
JNIEnv * const env = ps->env;
- jstring const s0 = z0 ? (*env)->NewStringUTF(env, z0) : 0;
- jstring const s1 = z1 ? (*env)->NewStringUTF(env, z1) : 0;
- jstring const s2 = z2 ? (*env)->NewStringUTF(env, z2) : 0;
- jstring const s3 = z3 ? (*env)->NewStringUTF(env, z3) : 0;
+ S3JniEnv * const jc = S3JniGlobal_env_cache(env);
S3JniHook const * const pHook = &ps->authHook;
+ jstring const s0 = z0 ? s3jni_utf8_to_jstring(jc, z0, -1) : 0;
+ jstring const s1 = z1 ? s3jni_utf8_to_jstring(jc, z1, -1) : 0;
+ jstring const s2 = z2 ? s3jni_utf8_to_jstring(jc, z2, -1) : 0;
+ jstring const s3 = z3 ? s3jni_utf8_to_jstring(jc, z3, -1) : 0;
int rc;
assert( pHook->jObj );
rc = (*env)->CallIntMethod(env, pHook->jObj, pHook->midCallback, (jint)op,
s0, s1, s3, s3);
IFTHREW{
- EXCEPTION_WARN_CALLBACK_THREW("sqlite3_set_authorizer() callback");
- EXCEPTION_CLEAR;
- if( !rc ) rc = SQLITE_ERROR;
+ rc = s3jni_db_exception(env, ps, rc, "sqlite3_set_authorizer() callback");
}
UNREF_L(s0);
UNREF_L(s1);
const char *zTable, sqlite3_int64 nRowid){
S3JniDb * const ps = pState;
JNIEnv * const env = ps->env;
- /* ACHTUNG: this will break if zDb or zTable contain chars which are
- different in MUTF-8 than UTF-8. That seems like a low risk,
- but it's possible. */
+ S3JniEnv * const jc = S3JniGlobal_env_cache(env);
jstring jDbName;
jstring jTable;
- jDbName = (*env)->NewStringUTF(env, zDb);
- jTable = jDbName ? (*env)->NewStringUTF(env, zTable) : 0;
+ jDbName = s3jni_utf8_to_jstring(jc, zDb, -1);
+ jTable = jDbName ? s3jni_utf8_to_jstring(jc, zTable, -1) : 0;
IFTHREW {
s3jni_db_error(ps->pDb, SQLITE_NOMEM, 0);
}else{
(jint)opId, jDbName, jTable, (jlong)nRowid);
IFTHREW{
EXCEPTION_WARN_CALLBACK_THREW("update hook");
- EXCEPTION_CLEAR;
- s3jni_db_error(ps->pDb, SQLITE_ERROR, "update hook callback threw.");
+ s3jni_db_exception(env, ps, 0, "update hook callback threw");
}
}
UNREF_L(jDbName);
pAux held by the JNI layer will be relinquished regardless of
whether pAux has an xDestroy() method. */
public synchronized native int xSetAuxdata(@NotNull Fts5Context cx, @Nullable Object pAux);
- public synchronized native int xTokenize(@NotNull Fts5Context cx, @NotNull byte pText[],
+ public synchronized native int xTokenize(@NotNull Fts5Context cx, @NotNull byte[] pText,
@NotNull Fts5.xTokenizeCallback callback);
public synchronized native Object xUserData(Fts5Context cx);
The known consequences and limitations this discrepancy places on
the SQLite3 JNI binding include:
- - Any functions which return client-side data from a database
- take extra care to perform proper conversion, at the cost of
- efficiency.
-
- - Functions which return database identifiers require those
- identifiers to have identical representations in UTF-8 and
- MUTF-8. They do not perform such conversions (A) because of the
- much lower risk of an encoding discrepancy and (B) to avoid
- significant extra code involved (see both the Java- and C-side
- implementations of sqlite3_db_filename() for an example). Names
- of databases, tables, columns, collations, and functions MUST NOT
- contain characters which differ in MUTF-8 and UTF-8, or certain
- APIs will mis-translate them on their way between languages
- (possibly leading to a crash).
+ - Any functions which return state from a database take extra care
+ to perform proper conversion, at the cost of efficiency.
- C functions which take C-style strings without a length argument
require special care when taking input from Java. In particular,
Java strings converted to byte arrays for encoding purposes are
not NUL-terminated, and conversion to a Java byte array must be
careful to add one. Functions which take a length do not require
- this. Search the SQLite3Jni class for "\0" for many examples.
+ this so long as the length is provided. Search the SQLite3Jni
+ class for "\0" for many examples.
- Similarly, C-side code which deals with strings which might not be
NUL-terminated (e.g. while tokenizing in FTS5-related code) cannot
-C Remove\ssome\sobsolete\sJNI-internal\sdocs.
-D 2023-08-17T22:04:07.712
+C Replace\sJNI::NewStringUTF()\sfor\sthe\sremaining\scases\swhere\soutput\smay\sbe\sincompatible\swith\sMUTF-8.\sIt\sis\snow\sonly\sused\swhen\swe\sknow\sthe\soutput\sto\sbe\splain\sASCII.
+D 2023-08-19T08:22:34.056
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
F ext/jni/GNUmakefile a9e11b92e620058558cbc1a2d49f8ec53c78d6a989b9db0b7d0b649b9f174881
F ext/jni/README.md 7a614a2fa6c561205f7a53fd8626cf93a7b5711ff454fc1814517f796df398eb
F ext/jni/jar-dist.make f90a553203a57934bf275bed86479485135a52f48ac5c1cfe6499ae07b0b35a4
-F ext/jni/src/c/sqlite3-jni.c 2682b02c376290924927386e8e0ab16c8b88feb50df584147e81696d8fb459e2
+F ext/jni/src/c/sqlite3-jni.c a8b51e4c63572d1655dafea38b80fd63528684264c6483b5c4d1eb9098c44712
F ext/jni/src/c/sqlite3-jni.h f10d2f38720687c70ecdd5e44f6e8db98efee2caa05fc86b2d9e0c76e6cc0a18
F ext/jni/src/org/sqlite/jni/Authorizer.java 1308988f7f40579ea0e4deeaec3c6be971630566bd021c31367fe3f5140db892
F ext/jni/src/org/sqlite/jni/AutoExtension.java 18e83f6f463e306df60b2dceb65247d32af1f78af4bbbae9155411a8c6cdb093
F ext/jni/src/org/sqlite/jni/CommitHook.java 87c6a8e5138c61a8eeff018fe16d23f29219150239746032687f245938baca1a
F ext/jni/src/org/sqlite/jni/Fts5.java 13844685231e8b4840a706db3bed84d5dfcf15be0ae7e809eac40420dba24901
F ext/jni/src/org/sqlite/jni/Fts5Context.java 0a5a02047a6a1dd3e4a38b0e542a8dd2de365033ba30e6ae019a676305959890
-F ext/jni/src/org/sqlite/jni/Fts5ExtensionApi.java 01f890105c6b7edbbad1c0f5635f783cea62c4b2ae694a71e76514a936ee03ec
+F ext/jni/src/org/sqlite/jni/Fts5ExtensionApi.java 93c0643e77a0226dad31610489490c6348ed9842c91e98f3ab0c440a173e75e7
F ext/jni/src/org/sqlite/jni/Fts5Function.java 65cde7151e441fee012250a5e03277de7babcd11a0c308a832b7940574259bcc
F ext/jni/src/org/sqlite/jni/Fts5PhraseIter.java 6642beda341c0b1b46af4e2d7f6f9ab03a7aede43277b2c92859176d6bce3be9
F ext/jni/src/org/sqlite/jni/Fts5Tokenizer.java 91489893596b6528c0df5cd7180bd5b55809c26e2b797fb321dfcdbc1298c060
F ext/jni/src/org/sqlite/jni/ResultCode.java ba701f20213a5f259e94cfbfdd36eb7ac7ce7797f2c6c7fca2004ff12ce20f86
F ext/jni/src/org/sqlite/jni/RollbackHook.java b04c8abcc6ade44a8a57129e33765793f69df0ba909e49ba18d73f4268d92564
F ext/jni/src/org/sqlite/jni/SQLFunction.java 09ce81c1c637e31c3a830d4c859cce95d65f5e02ff45f8bd1985b3479381bc46
-F ext/jni/src/org/sqlite/jni/SQLite3Jni.java 99334f54f5f41feb4c14dc988b93219e37799e032f2bc07bda6323b1dfb99e75
+F ext/jni/src/org/sqlite/jni/SQLite3Jni.java 26b3083501a9f42e9aa49b941f6b378213cf91ae1a8f705602773ed750043a3c
F ext/jni/src/org/sqlite/jni/Tester1.java 68b88b3098ce60134f4298488f890871398a77477af0a1b21797c59c911060c1
F ext/jni/src/org/sqlite/jni/TesterFts5.java 59e22dd24af033ea8827d36225a2f3297908fb6af8818ead8850c6c6847557b1
F ext/jni/src/org/sqlite/jni/Tracer.java a5cece9f947b0af27669b8baec300b6dd7ff859c3e6a6e4a1bd8b50f9714775d
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P c09c8d05a20d916a9d9304eeea723ef7666a862a9e53f5feeeb1b03f9153d4b2
-R 8dc048810b080415033a7139c2c39321
+P 00a2a3736a6dcde81d920815520040f3c47f965165e7128ca1f4062e6ec7c17c
+R 844cfc265e8ec15b67feebeb0f56ea87
U stephan
-Z f47443de82631501c87889e378989189
+Z a99a318492abbd023ca99730c8ec8838
# Remove this line to create a well-formed Fossil manifest.
-00a2a3736a6dcde81d920815520040f3c47f965165e7128ca1f4062e6ec7c17c
\ No newline at end of file
+2d955eef25ab116c487ebc34c6f2d2836d310af239ef1993f5aeee5a3f68d590
\ No newline at end of file