# HG changeset patch # User Adam Chlipala # Date 1379082250 14400 # Node ID 216a3a67ebe3c4b1f282c211851ab2c28377ad43 # Parent 9fc086e3c95a10cb7d7e010fca85a4eca041d591 Tweak Sergey's patch to work with Postgres diff -r 9fc086e3c95a -r 216a3a67ebe3 src/c/urweb.c --- 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; diff -r 9fc086e3c95a -r 216a3a67ebe3 tests/dbupload.ur --- /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 =>
); + return +
+
+ {x} +
+ end diff -r 9fc086e3c95a -r 216a3a67ebe3 tests/dbupload.urp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/dbupload.urp Fri Sep 13 10:24:10 2013 -0400 @@ -0,0 +1,6 @@ +database dbname=dbupload +sql dbupload.sql +allow mime * +rewrite all Dbupload/* + +dbupload