adamc@987: con link = fn t :: Type => unit adamc@987: adamc@987: con meta = fn col :: Type => { adamc@987: Link : link col, adamc@987: Inj : sql_injectable col adamc@987: } adamc@987: adamc@987: functor Table(M : sig adamc@987: con cols :: {Type} adamc@987: val cols : $(map meta cols) adamc@987: constraint [Id] ~ cols adamc@987: val folder : folder cols adamc@987: end) = struct adamc@987: type id = int adamc@987: val inj = _ adamc@987: val id : meta id = {Link = (), adamc@987: Inj = inj} adamc@987: adamc@987: sequence s adamc@987: table t : ([Id = id] ++ M.cols) adamc@987: adamc@987: fun create (r : $M.cols) = adamc@987: id <- nextval s; adamc@987: dml (insert t ({Id = sql_inject id} adamc@987: ++ map2 [meta] [Top.id] [sql_exp [] [] []] adamc@987: (fn [t ::: Type] (meta : meta t) (v : t) => @sql_inject meta.Inj v) adamc@987: [_] M.folder M.cols r)); adamc@987: return id adamc@987: end