Mercurial > urweb
changeset 1867:216a3a67ebe3
Tweak Sergey's patch to work with Postgres
author | Adam Chlipala <adam@chlipala.net> |
---|---|
date | Fri, 13 Sep 2013 10:24:10 -0400 |
parents | 9fc086e3c95a |
children | d6b0ee53dc93 |
files | src/c/urweb.c tests/dbupload.ur tests/dbupload.urp |
diffstat | 3 files changed, 55 insertions(+), 48 deletions(-) [+] |
line wrap: on
line diff
--- a/src/c/urweb.c Fri Sep 13 10:09:15 2013 -0400 +++ b/src/c/urweb.c Fri Sep 13 10:24:10 2013 -0400 @@ -2509,46 +2509,45 @@ char *uw_sqlsuffixBlob = "::bytea"; -uw_Basis_string uw_Basis_sqlifyBlob_old(uw_context ctx, uw_Basis_blob b) { +uw_Basis_string uw_Basis_sqlifyBlob(uw_context ctx, uw_Basis_blob b) { char *r, *s2; size_t i; - uw_check_heap(ctx, b.size * 5 + 3 + uw_Estrings + strlen(uw_sqlsuffixBlob)); + uw_check_heap(ctx, b.size * 5 + 4 + strlen(uw_sqlsuffixBlob)); r = s2 = ctx->heap.front; if (uw_Estrings) *s2++ = 'E'; + else + *s2++ = 'X'; *s2++ = '\''; for (i = 0; i < b.size; ++i) { - char c = b.data[i]; - - switch (c) { - case '\'': - if (uw_Estrings) + unsigned char c = b.data[i]; + + if (uw_Estrings) { + switch (c) { + case '\'': strcpy(s2, "\\'"); - else - strcpy(s2, "''"); - s2 += 2; - break; - case '\\': - if (uw_Estrings) { + s2 += 2; + break; + case '\\': strcpy(s2, "\\\\\\\\"); s2 += 4; - } else - *s2++ = '\\'; - break; - default: - if (isprint((int)c)) - *s2++ = c; - else if (uw_Estrings) { - sprintf(s2, "\\\\%03o", c); - s2 += 5; + break; + default: + if (isprint((int)c)) + *s2++ = c; + else { + sprintf(s2, "\\\\%03o", c); + s2 += 5; + } } - else - uw_error(ctx, FATAL, "Non-printable character %u in blob to SQLify", c); + } else { + sprintf(s2, "%02X", c); + s2 += 2; } - } + } *s2++ = '\''; strcpy(s2, uw_sqlsuffixBlob); @@ -2556,29 +2555,6 @@ return r; } -int uw_Xstrings = 1; - -uw_Basis_string uw_Basis_sqlifyBlob(uw_context ctx, uw_Basis_blob b) { - char *r, *s2; - size_t i; - - uw_check_heap(ctx, b.size * 2 + 3 + uw_Xstrings); - - r = s2 = ctx->heap.front; - *s2++ = 'X'; - *s2++ = '\''; - - for (i = 0; i < b.size; ++i) { - char c = b.data[i]; - sprintf(s2, "%02X", c); - s2 += 2; - } - - *s2++ = '\''; - ctx->heap.front = s2 + 1; - return r; -} - char *uw_Basis_sqlifyChannel(uw_context ctx, uw_Basis_channel chn) { int len; char *r;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/dbupload.ur Fri Sep 13 10:24:10 2013 -0400 @@ -0,0 +1,25 @@ +table t : { Id : int, Blob : blob, MimeType : string } +sequence s + +fun getImage id : transaction page = + r <- oneRow1 (SELECT t.Blob, t.MimeType + FROM t + WHERE t.Id = {[id]}); + returnBlob r.Blob (blessMime r.MimeType) + +fun main () : transaction page = + let + fun handle r = + id <- nextval s; + dml (INSERT INTO t (Id, Blob, MimeType) + VALUES ({[id]}, {[fileData r.File]}, {[fileMimeType r.File]})); + main () + in + x <- queryX1 (SELECT t.Id FROM t) + (fn r => <xml><img src={url (getImage r.Id)}/><br/></xml>); + return <xml><body> + <form><upload{#File}/> <submit action={handle}/></form> + <hr/> + {x} + </body></xml> + end