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
--- /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