Ah, I figured it out. Yes, Adam is right, everything works as expected. Regards, Sergey
2017-02-20 11:22 GMT+03:00 Sergey Mironov <[email protected]>: > Hi. I could confirm that the application posted by Marko returns file > content in both branches of [if]. I agree that it is strange. > > Below is the code UrWeb generated on my machine. At the first glance, > it is expected to return blob only on the size check failure. Somehow, > returnBlob is executed in the both cases. > > Regards, > Sergey > > > static uw_unit > __uwn_wrap_echoLength_4277(uw_context ctx, struct __uws_1 __uwr_x0_0, > uw_unit __uwr___1) > { > return(({ > uw_unit __uwr___2 = > (uw_begin_region(ctx), uw_Basis_debug(ctx, > uw_Basis_intToString(ctx, > uw_Basis_blobSize(ctx, > uw_Basis_fileData(ctx, > __uwr_x0_0.__uwf_File))))); > uw_end_region(ctx); > uw_Basis_htmlifyInt_w(ctx, > uw_Basis_strlen(ctx, > ({ > uw_Basis_bool disc = > ! > (uw_Basis_blobSize(ctx, > uw_Basis_fileData(ctx, __uwr_x0_0.__uwf_File)) <= 100000LL); > > disc == uw_Basis_True ? "Whoa! That one's too big." > : > disc == uw_Basis_False ? > ({ > uw_Basis_blob blob = > uw_Basis_fileData(ctx, __uwr_x0_0.__uwf_File); > uw_Basis_string mimeType = > uw_Basis_blessMime(ctx, > uw_Basis_fileMimeType(ctx, __uwr_x0_0.__uwf_File)); > uw_Basis_string > tmp; > uw_return_blob(ctx, blob, mimeType); > tmp; > }) > : > ({ > uw_Basis_string > tmp; > uw_error(ctx, FATAL, > "/nix/store/fby0l6fdwqrq0rsr25jbc9hhg2srix08-urweb-urp-Urpf/Urpf.ur:11:32-11:33: > pattern match failure"); > tmp; > }); > }))); > })); > } > > 2017-02-19 18:15 GMT+03:00 Adam Chlipala <[email protected]>: >> I think you've gotten the wrong idea about [returnBlob]. It operates in the >> style of exceptions, ending the transaction with the given result. It's not >> a normal function return, so you can't use it pass a blob from one part of >> your program to another. Also, it definitely doesn't generate strings. >> >> Somewhat intentionally, Ur/Web currently does not provide a way to >> introspect into a blob, without using the FFI. It would take some thought >> on what the right API would be. In my applications that involve CSV import, >> I have their content pasted into textboxes. >> >> >> On 02/19/2017 10:11 AM, Marko Schütz Schmuck wrote: >>> >>> I'm confused about the use of returnBlob. >>> >>> I was looking through the existing urweb demos to see how I could >>> access the data in a blob of mime type "text/plain" as a string. >>> Eventually, I want to import into a table from a CSV file the user >>> uploads. >>> >>> I hoped that returnBlob used in a transaction string could achieve >>> this. So I modified demo/upload.ur to >>> >>> fun echo (r : {File : file}) : transaction string = >>> if blobSize (fileData r.File) > 100000 then >>> return "Whoa! That one's too big." >>> else >>> returnBlob (fileData r.File) (blessMime (fileMimeType r.File)) >>> >>> fun echoLength (r : {File : file}) : transaction page = >>> s <- echo r ; >>> return <xml>{[String.length s]}</xml> >>> >>> fun main () : transaction page >>> = return <xml><body> >>> <h1>The Amazing File Echoer!</h1> >>> >>> <form>Upload a file: <upload{#File}/> <submit >>> action={echoLength}/></form> >>> </body></xml> >>> >>> This compiles and runs, and when I supply a file longer than 100000 I >>> get the expected page with the result 26, but to my surprise a shorter >>> file results in a page with the content of the file not it's length. >>> >>> I'd really appreciate some help. >>> >>> Thanks in advance and best regards, >>> >>> Marko >> >> >> _______________________________________________ >> Ur mailing list >> [email protected] >> http://www.impredicative.com/cgi-bin/mailman/listinfo/ur _______________________________________________ Ur mailing list [email protected] http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
