aboutsummaryrefslogtreecommitdiff
path: root/lib/sql/join.ml
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sql/join.ml')
-rw-r--r--lib/sql/join.ml30
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/sql/join.ml b/lib/sql/join.ml
new file mode 100644
index 0000000..3f82b92
--- /dev/null
+++ b/lib/sql/join.ml
@@ -0,0 +1,30 @@
+module D = Sqlite3.Data
+
+let f : Sqlite3.Data.t array -> Sqlite3.Data.t =
+ fun arguments ->
+ if Array.length arguments < 2 then Sqlite3.Data.NULL
+ else
+ let sep = Array.get arguments 0 in
+
+ (* Shift all the elements into an list*)
+ let contents =
+ Array.to_seqi arguments
+ |> Seq.filter_map (fun (i, value) ->
+ if i = 0 then None
+ else
+ match value with
+ | D.INT i -> Some (Int64.to_string i)
+ | D.FLOAT f -> Some (Float.to_string f)
+ | D.NONE -> None
+ | D.NULL -> None
+ | D.TEXT s | D.BLOB s ->
+ if String.length s = 0 then None else Some (String.trim s))
+ |> List.of_seq
+ in
+
+ D.TEXT (String.concat (D.to_string_coerce sep) contents)
+
+let register : Sqlite3.db -> unit =
+ fun db ->
+ Sqlite3.create_funN db "join" f;
+ Sqlite3.create_funN db "concat" f