# # patch "mlsqlite/sqlite3.ml" # from [eb012c8336ff254b7d50af97f4aa7cb68559f5be] # to [338cc1c5b7236092fbb8703848fa3708e56efffb] # # patch "mlsqlite/sqlite3.mli" # from [3cc1e7b6268c2fdf367ecdc0f4e5b6c8b2fe54c8] # to [f4b8ff580e57359fee1b728df9d8a9982158433c] # ======================================================================== --- mlsqlite/sqlite3.ml eb012c8336ff254b7d50af97f4aa7cb68559f5be +++ mlsqlite/sqlite3.ml 338cc1c5b7236092fbb8703848fa3708e56efffb @@ -160,26 +160,6 @@ let prepare_one_f db fmt = Printf.kprintf (_prepare_one db) fmt -let _prepare_all db sql = - let rec proc acc off = - if off >= String.length sql - then List.rev acc - else - match - try prepare db sql off - with exn -> - List.iter finalize_stmt acc ; - raise exn - with - | Some stmt, nxt -> proc (stmt :: acc) nxt - | None, nxt -> proc acc nxt in - proc [] 0 - -let prepare_all db sql = - let stmts = _prepare_all db (String.copy sql) in - List.iter (register_stmt db) stmts ; - stmts - external reset : stmt -> unit = "ml_sqlite3_reset" external expired : stmt -> bool = "ml_sqlite3_expired" external step : stmt -> [`DONE|`ROW] = "ml_sqlite3_step" @@ -230,18 +210,22 @@ external delete_function : db -> string -> unit = "ml_sqlite3_delete_function" +let fold_prepare db sql f init = + let rec loop acc off = + if off >= String.length sql + then acc + else + match prepare db sql off with + | Some stmt, nxt -> + let acc = + try f acc stmt + with exn -> finalize_stmt stmt ; raise exn in + finalize_stmt stmt ; + loop acc nxt + | None, nxt -> + loop acc nxt in + loop init 0 -let rec fold_stmts f acc = function - | [] -> acc - | stmt :: tl as stmts -> - let r = - try f acc stmt - with exn -> - List.iter finalize_stmt stmts ; - raise exn in - finalize_stmt stmt ; - fold_stmts f r tl - let rec fold_rows f acc stmt = match step stmt with | `DONE -> acc @@ -250,11 +234,11 @@ let _exec db sql = - fold_stmts + fold_prepare + db sql (fold_rows (fun () _ -> ())) () - (_prepare_all db sql) let exec db sql = _exec db (String.copy sql) @@ -281,10 +265,10 @@ stmt let _fetch db sql ?column_names f init = - fold_stmts + fold_prepare + db sql (fetch_one ?column_names f) init - (_prepare_all db sql) let fetch db sql ?column_names f init = _fetch db (String.copy sql) ?column_names f init ======================================================================== --- mlsqlite/sqlite3.mli 3cc1e7b6268c2fdf367ecdc0f4e5b6c8b2fe54c8 +++ mlsqlite/sqlite3.mli f4b8ff580e57359fee1b728df9d8a9982158433c @@ -71,7 +71,6 @@ external finalize_stmt : stmt -> unit = "ml_sqlite3_finalize_noerr" val prepare_one : db -> string -> stmt -val prepare_all : db -> string -> stmt list external reset : stmt -> unit = "ml_sqlite3_reset" external expired : stmt -> bool = "ml_sqlite3_expired"