aboutsummaryrefslogtreecommitdiff
path: root/lib/sql/match.ml
blob: 82fc1dadc8a4396d3061b0ed3eee9b77a775933c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
let f : Sqlite3.Data.t -> Sqlite3.Data.t -> Sqlite3.Data.t =
  let memo = Hashtbl.create 16 in
  fun str data_1 ->
    match (str, data_1) with
    | Sqlite3.Data.TEXT s, Sqlite3.Data.TEXT content -> (
        let regex =
          match Hashtbl.find_opt memo s with
          | None ->
              let regex = Re.Posix.compile_pat s in
              Hashtbl.add memo s regex;
              regex
          | Some v -> v
        in

        match Re.exec_opt regex content with
        | None -> Sqlite3.Data.NULL
        | Some g ->
            let matched = Re.Group.get g 1 in
            Sqlite3.Data.TEXT matched)
    | _, _ -> data_1

let register : Sqlite3.db -> unit = fun db -> Sqlite3.create_fun2 db "match" f