The unified diff between revisions [6691b5c8..] and [5eae6c37..] is displayed below. It can also be downloaded as a raw diff.

#
#
# patch "mlsqlite/ocaml-sqlite3.c"
#  from [aa91300e6fe9da56753089dc45ebb061c5a9f05f]
#    to [334cf3064dc352cce5fdc44fbbe2f69104eecba9]
#
# patch "mlsqlite/sqlite3.ml"
#  from [b0fdf5dd266be78db186bd51e9f15cc789f0954a]
#    to [30d614086bd175bbfe2d9a284b60cb947906da4c]
#
============================================================
--- mlsqlite/ocaml-sqlite3.c	aa91300e6fe9da56753089dc45ebb061c5a9f05f
+++ mlsqlite/ocaml-sqlite3.c	334cf3064dc352cce5fdc44fbbe2f69104eecba9
@@ -362,26 +362,16 @@ convert_sqlite3_type (int t)
 
 /* Prepared statements */

-static int
-ml_sqlite3_finalize_stmt (value s, sqlite3 **db)
+CAMLprim value
+ml_sqlite3_finalize_noerr (value s)
 {
-  int status = SQLITE_OK;
   sqlite3_stmt **p_stmt = (sqlite3_stmt **) Field (s, 0);

   if (*p_stmt != NULL)
     {
-      if (db != NULL)
-	*db = sqlite3_db_handle (*p_stmt);
-      status = sqlite3_finalize (*p_stmt);
+      sqlite3_finalize (*p_stmt);
       *p_stmt = NULL;
     }
-  return status;
-}
-
-CAMLprim value
-ml_sqlite3_finalize_noerr (value v)
-{
-  ml_sqlite3_finalize_stmt (v, NULL);
   return Val_unit;
 }

@@ -503,6 +493,7 @@ ml_sqlite3_step (value stmt)
 	    s = ml_sqlite3_recompile (stmt, s);
 	    goto again;
 	  }
+	db = sqlite3_db_handle (s);
 	ml_sqlite3_raise_exn (status, sqlite3_errmsg (db), TRUE);
       }
     }
============================================================
--- mlsqlite/sqlite3.ml	b0fdf5dd266be78db186bd51e9f15cc789f0954a
+++ mlsqlite/sqlite3.ml	30d614086bd175bbfe2d9a284b60cb947906da4c
@@ -234,8 +234,8 @@ let _fold_prepare ?(final=false) db sql
 	  register_stmt db stmt ;
 	  let acc =
 	    try f acc stmt
-	    with exn ->
-	      if final then finalize_stmt stmt ;
+	    with exn when final ->
+	      finalize_stmt stmt ;
 	      raise exn in
 	  if final then finalize_stmt stmt ;
 	  loop acc nxt
@@ -317,7 +317,12 @@ let rec fold_step f acc stmt =
   match step stmt with
   | `DONE -> acc
   | `ROW  ->
-      fold_step f (f acc stmt) stmt
+      let acc =
+	try f acc stmt
+	with exn ->
+	  reset stmt ;
+	  raise exn in
+      fold_step f acc stmt

 let _fetch db sql f init =
   _fold_prepare