aboutsummaryrefslogtreecommitdiff
path: root/lib/sql/join.ml
blob: 3f82b929eda481f00b760f2d61df50adf27fbed3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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