Advertisement
kenpusney

DB.ml (in first-class module)

Sep 21st, 2022 (edited)
2,077
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.60 KB | None | 0 0
  1. module type DB = sig
  2.   type t
  3.  
  4.   type result
  5.  
  6.   type query
  7.  
  8.   val connect : string -> t
  9.  
  10.   val create_query : string -> query
  11.  
  12.   val select : t -> query -> result option
  13.  
  14.   val insert : t -> query -> result option
  15.  
  16.   val update : t -> query -> result option
  17.  
  18. end
  19.  
  20. exception Unimplemented
  21.  
  22. module SomeSQL : DB = struct
  23.  
  24.   type t = Connection of string
  25.  
  26.   type result = bytes
  27.  
  28.   type query = string
  29.  
  30.   let connect s = Connection s
  31.  
  32.   let select t q = raise Unimplemented
  33.  
  34.   let insert t q = raise Unimplemented
  35.  
  36.   let update t q = raise Unimplemented
  37.  
  38.   let create_query s = s
  39. end
  40.  
  41.  
  42. module ExtDB(DBImpl: DB) = struct
  43.   include DBImpl
  44.  
  45.   let upsert t qs qi qu =
  46.     match (DBImpl.select t qs) with
  47.     | Some x -> DBImpl.update t qu
  48.     | None -> DBImpl.insert t qi
  49.  
  50. end
  51.  
  52. module ExtSomeSQL = ExtDB(SomeSQL)
  53.  
  54.  
  55. let () =
  56.  
  57.   let conn = ExtSomeSQL.connect "conn" in
  58.   let result = ExtSomeSQL.upsert conn (ExtSomeSQL.create_query "select")  
  59.             (ExtSomeSQL.create_query "on insert")  
  60.             (ExtSomeSQL.create_query "on update") in
  61.     ignore (result)
  62.  
  63.  
  64.  
  65.  
  66. let sql_impls = [
  67.   ("some_sql", (module SomeSQL : DB))
  68. ]
  69.  
  70. let get_sql_impl label =
  71.   let (_, impl) = List.find (fun (_label, _) -> label = _label) sql_impls
  72.   in
  73.   impl
  74.  
  75.  
  76. let () =
  77.   let module D = (val (get_sql_impl "some_sql"): DB) in (* module D = SomeSQL *)
  78.   let module E = ExtDB(D) in
  79.   let conn = E.connect "conn" in
  80.   let result = E.upsert conn (E.create_query "select")  
  81.             (E.create_query "on insert")  
  82.             (E.create_query "on update") in
  83.     ignore (result)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement