aboutsummaryrefslogtreecommitdiff
path: root/lib/sql/match.ml
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sql/match.ml')
-rw-r--r--lib/sql/match.ml22
1 files changed, 22 insertions, 0 deletions
diff --git a/lib/sql/match.ml b/lib/sql/match.ml
new file mode 100644
index 0000000..82fc1da
--- /dev/null
+++ b/lib/sql/match.ml
@@ -0,0 +1,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