view sql.urs @ 15:6ebc2ca594b7

Sql.insertIfMissing and deleteByKey (partly from Ron de Bruijn)
author Adam Chlipala <adam@chlipala.net>
date Sun, 11 Dec 2011 14:04:34 -0500
parents d05943db55e8
children 959583692166
line wrap: on
line source
(** Common metaprogramming patterns for SQL syntax construction *)

val sqexps : env ::: {{Type}} -> fields ::: {Type} -> folder fields -> $(map sql_injectable fields)
             -> $fields -> $(map (sql_exp env [] []) fields)
(* Convert a record of Ur values into a record of SQL expressions *)

val selector : tn :: Name -> fs ::: {Type} -> ofs ::: {Type} -> [fs ~ ofs]
               => folder fs -> $(map sql_injectable fs) -> $fs
               -> sql_exp [tn = ofs ++ fs] [] [] bool
(* Build a boolean SQL expression expressing equality of some fields of a table
 * row with a record of Ur values *)

val joiner : tn1 :: Name -> tn2 :: Name -> fs ::: {Type} -> ofs1 ::: {Type} -> ofs2 ::: {Type}
             -> [[tn1] ~ [tn2]] => [fs ~ ofs1] => [fs ~ ofs2]
               => folder fs
               -> sql_exp [tn1 = ofs1 ++ fs, tn2 = ofs2 ++ fs] [] [] bool
(* Declare equality of same-named columns from two tables. *)

val insertIfMissing : keyCols ::: {Type} -> otherCols ::: {Type} -> otherKeys ::: {{Unit}}
                      -> [keyCols ~ otherCols] => [[Pkey] ~ otherKeys]
                      => sql_table (keyCols ++ otherCols) ([Pkey = map (fn _ => ()) keyCols] ++ otherKeys)
                      -> $(keyCols ++ otherCols)
                      -> folder keyCols -> $(map sql_injectable keyCols)
                      -> folder otherCols -> $(map sql_injectable otherCols)
                      -> transaction bool
(* Insert a row into an SQL table if its key isn't already present, returning [False] iff the key was already present *)

val deleteByKey : keyCols ::: {Type} -> otherCols ::: {Type} -> otherKeys ::: {{Unit}}
                  -> [keyCols ~ otherCols] => [[Pkey] ~ otherKeys]
                  => sql_table (keyCols ++ otherCols) ([Pkey = map (fn _ => ()) keyCols] ++ otherKeys)
                  -> $keyCols -> folder keyCols -> $(map sql_injectable keyCols)
                  -> transaction {}
(* Delete a row from a table by matching its primary key against a given record. *)