[Ur] Need help with desugaring dml
fold at tuta.io
fold at tuta.io
Sat Feb 11 04:19:31 EST 2017
Actually, it might be quite simple.Incomplete, but, hopefully, clear example:
table tab : $([Ix = int] ++ someColumns ++ otherColumns) PRIMARY KEY Ix
fun test () : transaction xbody = <...> tn <- now; easy_insert tab ({Ix = ix} ++ field_defaults ++ {Dated = tn}); <...>
11. Feb 2017 22:09 by fold at tuta.io:
> Sergey,
> Something similar to this:> https://github.com/achlipala/upo/blob/master/sql.ur#L44
> and this:> https://github.com/achlipala/upo/blob/master/sql.ur#L50> might help you a bit.
> Also check other functions in sql.ur
> I believe you also can figure out desugared type expressions from compiler error output if you replace parts of your code with simple expressions of known type.
> https://wiki.haskell.org/GHC/Typed_holes
>
>
>
>
>
> 11. Feb 2017 21:18 by > grrwlf at gmail.com> :
>
>
>> Hi. I'm trying (again) to write an Ur/Web module to provide API for
>> managing OS-level processes. I expect users to pass it a table
>> containing _at_least_ id, process command name, arguments, placeholder
>> for exit code and status string. It is expected that users will use
>> tables containing more problem-specific columns.
>>
>> The problem is that I cant use simple dml operations anymore. As a
>> start, I tried to write dummy insert using [demo/more/orm.ur] as
>> example, but was stopped by difficult [ensql] function. Could you
>> please help me to implement it? The code is quite short and listed
>> below.
>>
>> Regards,
>> Sergey
>>
>> ---
>>
>> con jobinfo = [
>> Id = int
>> , ExitCode = option int
>> , Cmd = string
>> , Hint = string
>> ]
>>
>> functor Make(M : sig
>>
>> con u
>>
>> constraint [Id,ExitCode,Cmd,Hint] ~ u
>>
>> table t : (jobinfo ++ u)
>>
>> sequence s
>>
>> end) = struct
>>
>> open CallbackFFI
>>
>> type row' = record (jobinfo ++ M.u)
>>
>> (* fun ensql [avail ::_] (r : row') : $(map (sql_exp avail [] []) fs') = *)
>> (* @map2 [meta] [fst] [fn ts :: (Type * Type) => sql_exp avail
>> [] [] ts.1] *)
>> (* (fn [ts] meta v => @sql_inject meta.Inj v) *)
>> (* M.folder M.cols r *)
>>
>> (* createSync will start the job, but in this example it just does a
>> simple insert.
>> args is a problem-specific part of the table record.
>>
>> How to make this dml(insert..) work? *)
>>
>> fun createSync (ji : record jobinfo, args : record M.u) :
>> transaction (option int) =
>> i <- nextval M.s;
>> dml(insert M.t ({Id = sql_inject ji.Id,
>> ExitCode = sql_inject ji.ExitCode,
>> Cmd = sql_inject ji.Cmd,
>> Hint = sql_inject ji.Hint} ++ (ensql args) ));
>>
>> return (Some i)
>>
>> end
>>
>> _______________________________________________
>> Ur mailing list
>> Ur at impredicative.com
>> http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.impredicative.com/pipermail/ur/attachments/20170211/73f09cfc/attachment.html>
More information about the Ur
mailing list