Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module type DB = sig
- type t
- type result
- type query
- val connect : string -> t
- val create_query : string -> query
- val select : t -> query -> result option
- val insert : t -> query -> result option
- val update : t -> query -> result option
- end
- exception Unimplemented
- module SomeSQL : DB = struct
- type t = Connection of string
- type result = bytes
- type query = string
- let connect s = Connection s
- let select t q = raise Unimplemented
- let insert t q = raise Unimplemented
- let update t q = raise Unimplemented
- let create_query s = s
- end
- module ExtDB(DBImpl: DB) = struct
- include DBImpl
- let upsert t qs qi qu =
- match (DBImpl.select t qs) with
- | Some x -> DBImpl.update t qu
- | None -> DBImpl.insert t qi
- end
- module ExtSomeSQL = ExtDB(SomeSQL)
- let () =
- let conn = ExtSomeSQL.connect "conn" in
- let result = ExtSomeSQL.upsert conn (ExtSomeSQL.create_query "select")
- (ExtSomeSQL.create_query "on insert")
- (ExtSomeSQL.create_query "on update") in
- ignore (result)
- let sql_impls = [
- ("some_sql", (module SomeSQL : DB))
- ]
- let get_sql_impl label =
- let (_, impl) = List.find (fun (_label, _) -> label = _label) sql_impls
- in
- impl
- let () =
- let module D = (val (get_sql_impl "some_sql"): DB) in (* module D = SomeSQL *)
- let module E = ExtDB(D) in
- let conn = E.connect "conn" in
- let result = E.upsert conn (E.create_query "select")
- (E.create_query "on insert")
- (E.create_query "on update") in
- ignore (result)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement