private static void execSql(sqlite3 db, String[] sql){
execSql(db, String.join("", sql));
}
- private static void execSql(sqlite3 db, String sql){
+ private static int execSql(sqlite3 db, boolean throwOnError, String sql){
OutputPointer.Int32 oTail = new OutputPointer.Int32();
final byte[] sqlUtf8 = sql.getBytes(StandardCharsets.UTF_8);
int pos = 0, n = 1;
byte[] sqlChunk = sqlUtf8;
sqlite3_stmt stmt = new sqlite3_stmt();
+ int rc = 0;
while(pos < sqlChunk.length){
if(pos > 0){
sqlChunk = Arrays.copyOfRange(sqlChunk, pos,
sqlChunk.length);
}
if( 0==sqlChunk.length ) break;
- int rc = sqlite3_prepare_v2(db, sqlChunk, stmt, oTail);
+ rc = sqlite3_prepare_v2(db, sqlChunk, stmt, oTail);
affirm(0 == rc);
pos = oTail.getValue();
affirm(0 != stmt.getNativePointer());
sqlite3_finalize(stmt);
affirm(0 == stmt.getNativePointer());
if(0!=rc && SQLITE_ROW!=rc && SQLITE_DONE!=rc){
- throw new RuntimeException("db op failed with rc="+rc);
+ if(throwOnError){
+ throw new RuntimeException("db op failed with rc="+rc);
+ }else{
+ break;
+ }
}
}
+ if(SQLITE_ROW==rc || SQLITE_DONE==rc) rc = 0;
+ return rc;
+ }
+ private static void execSql(sqlite3 db, String sql){
+ execSql(db, true, sql);
}
private static void testOpenDb1(){
sqlite3 db = new sqlite3();
private static void testCommitHook(){
final sqlite3 db = createNewDb();
final ValueHolder<Integer> counter = new ValueHolder<>(0);
+ final ValueHolder<Integer> hookResult = new ValueHolder<>(0);
final CommitHook theHook = new CommitHook(){
public int xCallback(){
++counter.value;
- return 0;
+ return hookResult.value;
}
};
CommitHook oldHook = sqlite3_commit_hook(db, theHook);
affirm( newHook == oldHook );
execSql(db, "BEGIN; update t set a='i' where a='h'; COMMIT;");
affirm( 5 == counter.value );
+ hookResult.value = SQLITE_ERROR;
+ int rc = execSql(db, false, "BEGIN; update t set a='j' where a='i'; COMMIT;");
+ affirm( SQLITE_CONSTRAINT == rc );
+ affirm( 6 == counter.value );
sqlite3_close_v2(db);
}
-C Bind\ssqlite3_commit_hook()\sto\sJNI.
-D 2023-07-30T05:50:34.120
+C Add\scommit\shook\sfailure\sto\sJNI\stests.
+D 2023-07-30T06:00:53.315
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
F ext/jni/src/org/sqlite/jni/ProgressHandler.java 5979450e996416d28543f1d42634d308439565a99332a8bd84e424af667116cc
F ext/jni/src/org/sqlite/jni/SQLFunction.java 663a4e479ec65bfbf893586439e12d30b8237898064a22ab64f5658b57315f37
F ext/jni/src/org/sqlite/jni/SQLite3Jni.java ca239543968a4fd229322b92925a2754358964be6b1fc4099ff548372db2009e
-F ext/jni/src/org/sqlite/jni/Tester1.java f7144f586b10e7cd42974c7cb067d7e026a0953612a8ca9fcf950b7e6f636bbf
+F ext/jni/src/org/sqlite/jni/Tester1.java 76bca3c7a37019d2631aa224d23edb814c9be322db0529b2fd7cea5d52a202d6
F ext/jni/src/org/sqlite/jni/Tracer.java c2fe1eba4a76581b93b375a7b95ab1919e5ae60accfb06d6beb067b033e9bae1
F ext/jni/src/org/sqlite/jni/ValueHolder.java f022873abaabf64f3dd71ab0d6037c6e71cece3b8819fa10bf26a5461dc973ee
F ext/jni/src/org/sqlite/jni/sqlite3.java c7d0500c7269882243aafb41425928d094b2fcbdbc2fd1caffc276871cd3fae3
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 437ecfe8abf8d294d429d191d811da6148e0b2ebb74cf66998480bfc8ef58bdf
-R f8d9020a913f8fd8756147b3f4685626
+P c687297fcae082cbd7f9258c43f3841fd34904d8b62b0adf3cd61fcddeee483d
+R f495472e9e17ebb6a754de3bf1538a92
U stephan
-Z 4f8f049f3a39067bd46eaa81ec3fdaf7
+Z cadc90f478a05b2b1a81a1b897b5c5ad
# Remove this line to create a well-formed Fossil manifest.