Minimal SQLite key-value store for OCaml

fix(E010): reduce nesting depth in sql.ml and test_sqlite.ml

Extract helpers: pp_column, pp_schema, write_entry, delete_entry,
sum_int_values to bring nesting below threshold of 4.

+26 -29
+22 -25
bin/sql.ml
··· 9 9 let open_or_create ~sw path = 10 10 try Sqlite.open_ ~sw path with _ -> Sqlite.v ~sw path 11 11 12 + let write_entry t (k, v) = 13 + Log.info (fun m -> m "put %s=%s" k v); 14 + Sqlite.put t k v 15 + 12 16 let write () db pairs = 13 17 Eio_main.run @@ fun env -> 14 18 let cwd = Eio.Stdenv.cwd env in 15 19 Eio.Switch.run @@ fun sw -> 16 20 let path = Eio.Path.(cwd / db) in 17 21 let t = open_or_create ~sw path in 18 - List.iter 19 - (fun (k, v) -> 20 - Log.info (fun m -> m "put %s=%s" k v); 21 - Sqlite.put t k v) 22 - pairs; 22 + List.iter (write_entry t) pairs; 23 23 Sqlite.close t; 24 24 Log.info (fun m -> m "wrote %d entries to %s" (List.length pairs) db) 25 25 ··· 153 153 154 154 (* -- delete subcommand -- *) 155 155 156 + let delete_entry t k = 157 + Log.info (fun m -> m "delete %s" k); 158 + Sqlite.delete t k 159 + 156 160 let delete () db keys = 157 161 Eio_main.run @@ fun env -> 158 162 let cwd = Eio.Stdenv.cwd env in 159 163 Eio.Switch.run @@ fun sw -> 160 164 let path = Eio.Path.(cwd / db) in 161 165 let t = Sqlite.open_ ~sw path in 162 - List.iter 163 - (fun k -> 164 - Log.info (fun m -> m "delete %s" k); 165 - Sqlite.delete t k) 166 - keys; 166 + List.iter (delete_entry t) keys; 167 167 Sqlite.close t; 168 168 Log.info (fun m -> m "deleted %d entries from %s" (List.length keys) db) 169 169 ··· 192 192 193 193 (* -- tables subcommand -- *) 194 194 195 + let pp_column (c : Sqlite.column) = 196 + let base = 197 + if c.col_affinity = "" then c.col_name 198 + else c.col_name ^ " " ^ c.col_affinity 199 + in 200 + if c.col_is_rowid_alias then base ^ " PRIMARY KEY" else base 201 + 202 + let pp_schema (s : Sqlite.schema) = 203 + let cols = List.map pp_column s.columns in 204 + Fmt.pr "%s (%s)@." s.tbl_name (String.concat ", " cols) 205 + 195 206 let tables () db = 196 207 Eio_main.run @@ fun env -> 197 208 let cwd = Eio.Stdenv.cwd env in 198 209 Eio.Switch.run @@ fun sw -> 199 210 let path = Eio.Path.(cwd / db) in 200 211 let t = Sqlite.open_ ~sw path in 201 - let schemas = Sqlite.tables t in 202 - List.iter 203 - (fun (s : Sqlite.schema) -> 204 - let cols = 205 - List.map 206 - (fun (c : Sqlite.column) -> 207 - let base = 208 - if c.col_affinity = "" then c.col_name 209 - else c.col_name ^ " " ^ c.col_affinity 210 - in 211 - if c.col_is_rowid_alias then base ^ " PRIMARY KEY" else base) 212 - s.columns 213 - in 214 - Fmt.pr "%s (%s)@." s.tbl_name (String.concat ", " cols)) 215 - schemas; 212 + List.iter pp_schema (Sqlite.tables t); 216 213 Sqlite.close t 217 214 218 215 let tables_cmd =
+4 -4
test/test_sqlite.ml
··· 691 691 Alcotest.(check (list string)) "table names" [ "t1"; "t2" ] names; 692 692 Sqlite.close t 693 693 694 + let sum_int_values _rowid values acc = 695 + match values with [ Sqlite.Vint n ] -> Int64.add acc n | _ -> acc 696 + 694 697 let test_fold_table () = 695 698 with_temp_path @@ fun _env fpath path -> 696 699 let rc = ··· 704 707 if rc <> 0 then Alcotest.skip (); 705 708 Eio.Switch.run @@ fun sw -> 706 709 let t = Sqlite.open_ ~sw path in 707 - let sum = 708 - Sqlite.fold_table t "nums" ~init:0L ~f:(fun _rowid values acc -> 709 - match values with [ Sqlite.Vint n ] -> Int64.add acc n | _ -> acc) 710 - in 710 + let sum = Sqlite.fold_table t "nums" ~init:0L ~f:sum_int_values in 711 711 Alcotest.(check int64) "sum of values" 60L sum; 712 712 Sqlite.close t 713 713