diff src/cjr_print.sml @ 858:346cf1908a17

Avoid using prepared statements for non-persistent protocols
author Adam Chlipala <adamc@hcoop.net>
date Sat, 27 Jun 2009 10:50:45 -0400
parents 2fbd1ac2f04b
children 305bc0a431de
line wrap: on
line diff
--- a/src/cjr_print.sml	Sat Jun 27 10:30:51 2009 -0400
+++ b/src/cjr_print.sml	Sat Jun 27 10:50:45 2009 -0400
@@ -1641,11 +1641,19 @@
                  string "PGresult *res = ",
                  case prepared of
                      NONE => string "PQexecParams(conn, query, 0, NULL, NULL, NULL, NULL, 0);"
-                   | SOME n => box [string "PQexecPrepared(conn, \"uw",
-                                    string (Int.toString n),
-                                    string "\", ",
-                                    string (Int.toString (length (getPargs query))),
-                                    string ", paramValues, paramLengths, paramFormats, 0);"],
+                   | SOME (n, s) =>
+                     if #persistent (Settings.currentProtocol ()) then
+                         box [string "PQexecPrepared(conn, \"uw",
+                              string (Int.toString n),
+                              string "\", ",
+                              string (Int.toString (length (getPargs query))),
+                              string ", paramValues, paramLengths, paramFormats, 0);"]
+                     else
+                         box [string "PQexecParams(conn, \"",
+                              string (String.toString s),
+                              string "\", ",
+                              string (Int.toString (length (getPargs query))),
+                              string ", NULL, paramValues, paramLengths, paramFormats, 0);"],
                  newline,
                  newline,
 
@@ -1820,11 +1828,19 @@
              string "PGresult *res = ",
              case prepared of
                  NONE => string "PQexecParams(conn, dml, 0, NULL, NULL, NULL, NULL, 0);"
-               | SOME n => box [string "PQexecPrepared(conn, \"uw",
-                                string (Int.toString n),
-                                string "\", ",
-                                string (Int.toString (length (getPargs dml))),
-                                string ", paramValues, paramLengths, paramFormats, 0);"],
+               | SOME (n, s) =>
+                 if #persistent (Settings.currentProtocol ()) then
+                     box [string "PQexecPrepared(conn, \"uw",
+                          string (Int.toString n),
+                          string "\", ",
+                          string (Int.toString (length (getPargs dml))),
+                          string ", paramValues, paramLengths, paramFormats, 0);"]
+                 else
+                     box [string "PQexecParams(conn, \"",
+                          string (String.toString s),
+                          string "\", ",
+                          string (Int.toString (length (getPargs dml))),
+                          string ", NULL, paramValues, paramLengths, paramFormats, 0);"],
              newline,
              newline,
 
@@ -1892,9 +1908,15 @@
                  string "PGresult *res = ",
                  case prepared of
                      NONE => string "PQexecParams(conn, query, 0, NULL, NULL, NULL, NULL, 0);"
-                   | SOME n => box [string "PQexecPrepared(conn, \"uw",
-                                    string (Int.toString n),
-                                    string "\", 0, NULL, NULL, NULL, 0);"],
+                   | SOME (n, s) =>
+                     if #persistent (Settings.currentProtocol ()) then
+                         box [string "PQexecPrepared(conn, \"uw",
+                              string (Int.toString n),
+                              string "\", 0, NULL, NULL, NULL, 0);"]
+                     else
+                         box [string "PQexecParams(conn, \"uw",
+                              string (Int.toString n),
+                              string "\", 0, NULL, NULL, NULL, NULL, 0);"],
                  newline,
                  string "uw_Basis_int n;",
                  newline,
@@ -2306,46 +2328,49 @@
              newline,
              string "}"]
       | DPreparedStatements ss =>
-        box [string "static void uw_db_prepare(uw_context ctx) {",
-             newline,
-             string "PGconn *conn = uw_get_db(ctx);",
-             newline,
-             string "PGresult *res;",
-             newline,
-             newline,
+        if #persistent (Settings.currentProtocol ()) then
+            box [string "static void uw_db_prepare(uw_context ctx) {",
+                 newline,
+                 string "PGconn *conn = uw_get_db(ctx);",
+                 newline,
+                 string "PGresult *res;",
+                 newline,
+                 newline,
 
-             p_list_sepi newline (fn i => fn (s, n) =>
-                                             box [string "res = PQprepare(conn, \"uw",
-                                                  string (Int.toString i),
-                                                  string "\", \"",
-                                                  string (String.toString s),
-                                                  string "\", ",
-                                                  string (Int.toString n),
-                                                  string ", NULL);",
-                                                  newline,
-                                                  string "if (PQresultStatus(res) != PGRES_COMMAND_OK) {",
-                                                  newline,
-                                                  box [string "char msg[1024];",
-                                                       newline,
-                                                       string "strncpy(msg, PQerrorMessage(conn), 1024);",
-                                                       newline,
-                                                       string "msg[1023] = 0;",
-                                                       newline,
-                                                       string "PQclear(res);",
-                                                       newline,
-                                                       string "PQfinish(conn);",
-                                                       newline,
-                                                       string "uw_error(ctx, FATAL, \"Unable to create prepared statement:\\n",
-                                                       string (String.toString s),
-                                                       string "\\n%s\", msg);",
-                                                       newline],
-                                                  string "}",
-                                                  newline,
-                                                  string "PQclear(res);",
-                                                  newline])
-                         ss,
-             
-             string "}"]
+                 p_list_sepi newline (fn i => fn (s, n) =>
+                                                 box [string "res = PQprepare(conn, \"uw",
+                                                      string (Int.toString i),
+                                                      string "\", \"",
+                                                      string (String.toString s),
+                                                      string "\", ",
+                                                      string (Int.toString n),
+                                                      string ", NULL);",
+                                                      newline,
+                                                      string "if (PQresultStatus(res) != PGRES_COMMAND_OK) {",
+                                                      newline,
+                                                      box [string "char msg[1024];",
+                                                           newline,
+                                                           string "strncpy(msg, PQerrorMessage(conn), 1024);",
+                                                           newline,
+                                                           string "msg[1023] = 0;",
+                                                           newline,
+                                                           string "PQclear(res);",
+                                                           newline,
+                                                           string "PQfinish(conn);",
+                                                           newline,
+                                                           string "uw_error(ctx, FATAL, \"Unable to create prepared statement:\\n",
+                                                           string (String.toString s),
+                                                           string "\\n%s\", msg);",
+                                                           newline],
+                                                      string "}",
+                                                      newline,
+                                                      string "PQclear(res);",
+                                                      newline])
+                             ss,
+                 
+                 string "}"]
+        else
+            string "static void uw_db_prepare(uw_context ctx) { }"
 
       | DJavaScript s => box [string "static char jslib[] = \"",
                               string (String.toString s),
@@ -2928,256 +2953,259 @@
                                           | _ => NONE) ds
 
         val validate =
-            box [string "static void uw_db_validate(uw_context ctx) {",
-                 newline,
-                 string "PGconn *conn = uw_get_db(ctx);",
-                 newline,
-                 string "PGresult *res;",
-                 newline,
-                 newline,
-                 p_list_sep newline
-                            (fn (s, xts) =>
-                                let
-                                    val sl = CharVector.map Char.toLower s
+            if #persistent (Settings.currentProtocol ()) then
+                box [string "static void uw_db_validate(uw_context ctx) {",
+                     newline,
+                     string "PGconn *conn = uw_get_db(ctx);",
+                     newline,
+                     string "PGresult *res;",
+                     newline,
+                     newline,
+                     p_list_sep newline
+                                (fn (s, xts) =>
+                                    let
+                                        val sl = CharVector.map Char.toLower s
 
-                                    val q = "SELECT COUNT(*) FROM pg_class WHERE relname = '"
-                                            ^ sl ^ "'"
+                                        val q = "SELECT COUNT(*) FROM pg_class WHERE relname = '"
+                                                ^ sl ^ "'"
 
-                                    val q' = String.concat ["SELECT COUNT(*) FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = '",
-                                                            sl,
-                                                            "') AND (",
-                                                            String.concatWith " OR "
-                                                              (map (fn (x, t) =>
-                                                                       String.concat ["(attname = 'uw_",
-                                                                                      CharVector.map
-                                                                                          Char.toLower (ident x),
-                                                                                      "' AND atttypid = (SELECT oid FROM pg_type",
-                                                                                      " WHERE typname = '",
-                                                                                      p_sqltype_base' env t,
-                                                                                      "') AND attnotnull = ",
-                                                                                      if is_not_null t then
-                                                                                          "TRUE"
-                                                                                      else
-                                                                                          "FALSE",
-                                                                                      ")"]) xts),
-                                                            ")"]
+                                        val q' = String.concat ["SELECT COUNT(*) FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = '",
+                                                                sl,
+                                                                "') AND (",
+                                                                String.concatWith " OR "
+                                                                                  (map (fn (x, t) =>
+                                                                                           String.concat ["(attname = 'uw_",
+                                                                                                          CharVector.map
+                                                                                                              Char.toLower (ident x),
+                                                                                                          "' AND atttypid = (SELECT oid FROM pg_type",
+                                                                                                          " WHERE typname = '",
+                                                                                                          p_sqltype_base' env t,
+                                                                                                          "') AND attnotnull = ",
+                                                                                                          if is_not_null t then
+                                                                                                              "TRUE"
+                                                                                                          else
+                                                                                                              "FALSE",
+                                                                                                          ")"]) xts),
+                                                                ")"]
 
-                                    val q'' = String.concat ["SELECT COUNT(*) FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = '",
-                                                             sl,
-                                                             "') AND attname LIKE 'uw_%'"]
-                                in
-                                    box [string "res = PQexec(conn, \"",
-                                         string q,
-                                         string "\");",
-                                         newline,
-                                         newline,
-                                         string "if (res == NULL) {",
-                                         newline,
-                                         box [string "PQfinish(conn);",
-                                              newline,
-                                              string "uw_error(ctx, FATAL, \"Out of memory allocating query result.\");",
-                                              newline],
-                                         string "}",
-                                         newline,
-                                         newline,
-                                         string "if (PQresultStatus(res) != PGRES_TUPLES_OK) {",
-                                         newline,
-                                         box [string "char msg[1024];",
-                                              newline,
-                                              string "strncpy(msg, PQerrorMessage(conn), 1024);",
-                                              newline,
-                                              string "msg[1023] = 0;",
-                                              newline,
-                                              string "PQclear(res);",
-                                              newline,
-                                              string "PQfinish(conn);",
-                                              newline,
-                                              string "uw_error(ctx, FATAL, \"Query failed:\\n",
-                                              string q,
-                                              string "\\n%s\", msg);",
-                                              newline],
-                                         string "}",
-                                         newline,
-                                         newline,
-                                         string "if (strcmp(PQgetvalue(res, 0, 0), \"1\")) {",
-                                         newline,
-                                         box [string "PQclear(res);",
-                                              newline,
-                                              string "PQfinish(conn);",
-                                              newline,
-                                              string "uw_error(ctx, FATAL, \"Table '",
-                                              string s,
-                                              string "' does not exist.\");",
-                                              newline],
-                                         string "}",
-                                         newline,
-                                         newline,
-                                         string "PQclear(res);",
-                                         newline,
+                                        val q'' = String.concat ["SELECT COUNT(*) FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = '",
+                                                                 sl,
+                                                                 "') AND attname LIKE 'uw_%'"]
+                                    in
+                                        box [string "res = PQexec(conn, \"",
+                                             string q,
+                                             string "\");",
+                                             newline,
+                                             newline,
+                                             string "if (res == NULL) {",
+                                             newline,
+                                             box [string "PQfinish(conn);",
+                                                  newline,
+                                                  string "uw_error(ctx, FATAL, \"Out of memory allocating query result.\");",
+                                                  newline],
+                                             string "}",
+                                             newline,
+                                             newline,
+                                             string "if (PQresultStatus(res) != PGRES_TUPLES_OK) {",
+                                             newline,
+                                             box [string "char msg[1024];",
+                                                  newline,
+                                                  string "strncpy(msg, PQerrorMessage(conn), 1024);",
+                                                  newline,
+                                                  string "msg[1023] = 0;",
+                                                  newline,
+                                                  string "PQclear(res);",
+                                                  newline,
+                                                  string "PQfinish(conn);",
+                                                  newline,
+                                                  string "uw_error(ctx, FATAL, \"Query failed:\\n",
+                                                  string q,
+                                                  string "\\n%s\", msg);",
+                                                  newline],
+                                             string "}",
+                                             newline,
+                                             newline,
+                                             string "if (strcmp(PQgetvalue(res, 0, 0), \"1\")) {",
+                                             newline,
+                                             box [string "PQclear(res);",
+                                                  newline,
+                                                  string "PQfinish(conn);",
+                                                  newline,
+                                                  string "uw_error(ctx, FATAL, \"Table '",
+                                                  string s,
+                                                  string "' does not exist.\");",
+                                                  newline],
+                                             string "}",
+                                             newline,
+                                             newline,
+                                             string "PQclear(res);",
+                                             newline,
 
-                                         string "res = PQexec(conn, \"",
-                                         string q',
-                                         string "\");",
-                                         newline,
-                                         newline,
-                                         string "if (res == NULL) {",
-                                         newline,
-                                         box [string "PQfinish(conn);",
-                                              newline,
-                                              string "uw_error(ctx, FATAL, \"Out of memory allocating query result.\");",
-                                              newline],
-                                         string "}",
-                                         newline,
-                                         newline,
-                                         string "if (PQresultStatus(res) != PGRES_TUPLES_OK) {",
-                                         newline,
-                                         box [string "char msg[1024];",
-                                              newline,
-                                              string "strncpy(msg, PQerrorMessage(conn), 1024);",
-                                              newline,
-                                              string "msg[1023] = 0;",
-                                              newline,
-                                              string "PQclear(res);",
-                                              newline,
-                                              string "PQfinish(conn);",
-                                              newline,
-                                              string "uw_error(ctx, FATAL, \"Query failed:\\n",
-                                              string q',
-                                              string "\\n%s\", msg);",
-                                              newline],
-                                         string "}",
-                                         newline,
-                                         newline,
-                                         string "if (strcmp(PQgetvalue(res, 0, 0), \"",
-                                         string (Int.toString (length xts)),
-                                         string "\")) {",
-                                         newline,
-                                         box [string "PQclear(res);",
-                                              newline,
-                                              string "PQfinish(conn);",
-                                              newline,
-                                              string "uw_error(ctx, FATAL, \"Table '",
-                                              string s,
-                                              string "' has the wrong column types.\");",
-                                              newline],
-                                         string "}",
-                                         newline,
-                                         newline,
-                                         string "PQclear(res);",
-                                         newline,
-                                         newline,
+                                             string "res = PQexec(conn, \"",
+                                             string q',
+                                             string "\");",
+                                             newline,
+                                             newline,
+                                             string "if (res == NULL) {",
+                                             newline,
+                                             box [string "PQfinish(conn);",
+                                                  newline,
+                                                  string "uw_error(ctx, FATAL, \"Out of memory allocating query result.\");",
+                                                  newline],
+                                             string "}",
+                                             newline,
+                                             newline,
+                                             string "if (PQresultStatus(res) != PGRES_TUPLES_OK) {",
+                                             newline,
+                                             box [string "char msg[1024];",
+                                                  newline,
+                                                  string "strncpy(msg, PQerrorMessage(conn), 1024);",
+                                                  newline,
+                                                  string "msg[1023] = 0;",
+                                                  newline,
+                                                  string "PQclear(res);",
+                                                  newline,
+                                                  string "PQfinish(conn);",
+                                                  newline,
+                                                  string "uw_error(ctx, FATAL, \"Query failed:\\n",
+                                                  string q',
+                                                  string "\\n%s\", msg);",
+                                                  newline],
+                                             string "}",
+                                             newline,
+                                             newline,
+                                             string "if (strcmp(PQgetvalue(res, 0, 0), \"",
+                                             string (Int.toString (length xts)),
+                                             string "\")) {",
+                                             newline,
+                                             box [string "PQclear(res);",
+                                                  newline,
+                                                  string "PQfinish(conn);",
+                                                  newline,
+                                                  string "uw_error(ctx, FATAL, \"Table '",
+                                                  string s,
+                                                  string "' has the wrong column types.\");",
+                                                  newline],
+                                             string "}",
+                                             newline,
+                                             newline,
+                                             string "PQclear(res);",
+                                             newline,
+                                             newline,
 
-                                         string "res = PQexec(conn, \"",
-                                         string q'',
-                                         string "\");",
-                                         newline,
-                                         newline,
-                                         string "if (res == NULL) {",
-                                         newline,
-                                         box [string "PQfinish(conn);",
-                                              newline,
-                                              string "uw_error(ctx, FATAL, \"Out of memory allocating query result.\");",
-                                              newline],
-                                         string "}",
-                                         newline,
-                                         newline,
-                                         string "if (PQresultStatus(res) != PGRES_TUPLES_OK) {",
-                                         newline,
-                                         box [string "char msg[1024];",
-                                              newline,
-                                              string "strncpy(msg, PQerrorMessage(conn), 1024);",
-                                              newline,
-                                              string "msg[1023] = 0;",
-                                              newline,
-                                              string "PQclear(res);",
-                                              newline,
-                                              string "PQfinish(conn);",
-                                              newline,
-                                              string "uw_error(ctx, FATAL, \"Query failed:\\n",
-                                              string q'',
-                                              string "\\n%s\", msg);",
-                                              newline],
-                                         string "}",
-                                         newline,
-                                         newline,
-                                         string "if (strcmp(PQgetvalue(res, 0, 0), \"",
-                                         string (Int.toString (length xts)),
-                                         string "\")) {",
-                                         newline,
-                                         box [string "PQclear(res);",
-                                              newline,
-                                              string "PQfinish(conn);",
-                                              newline,
-                                              string "uw_error(ctx, FATAL, \"Table '",
-                                              string s,
-                                              string "' has extra columns.\");",
-                                              newline],
-                                         string "}",
-                                         newline,
-                                         newline,
-                                         string "PQclear(res);",
-                                         newline]
-                                end) tables,
+                                             string "res = PQexec(conn, \"",
+                                             string q'',
+                                             string "\");",
+                                             newline,
+                                             newline,
+                                             string "if (res == NULL) {",
+                                             newline,
+                                             box [string "PQfinish(conn);",
+                                                  newline,
+                                                  string "uw_error(ctx, FATAL, \"Out of memory allocating query result.\");",
+                                                  newline],
+                                             string "}",
+                                             newline,
+                                             newline,
+                                             string "if (PQresultStatus(res) != PGRES_TUPLES_OK) {",
+                                             newline,
+                                             box [string "char msg[1024];",
+                                                  newline,
+                                                  string "strncpy(msg, PQerrorMessage(conn), 1024);",
+                                                  newline,
+                                                  string "msg[1023] = 0;",
+                                                  newline,
+                                                  string "PQclear(res);",
+                                                  newline,
+                                                  string "PQfinish(conn);",
+                                                  newline,
+                                                  string "uw_error(ctx, FATAL, \"Query failed:\\n",
+                                                  string q'',
+                                                  string "\\n%s\", msg);",
+                                                  newline],
+                                             string "}",
+                                             newline,
+                                             newline,
+                                             string "if (strcmp(PQgetvalue(res, 0, 0), \"",
+                                             string (Int.toString (length xts)),
+                                             string "\")) {",
+                                             newline,
+                                             box [string "PQclear(res);",
+                                                  newline,
+                                                  string "PQfinish(conn);",
+                                                  newline,
+                                                  string "uw_error(ctx, FATAL, \"Table '",
+                                                  string s,
+                                                  string "' has extra columns.\");",
+                                                  newline],
+                                             string "}",
+                                             newline,
+                                             newline,
+                                             string "PQclear(res);",
+                                             newline]
+                                    end) tables,
 
-                 p_list_sep newline
-                            (fn s =>
-                                let
-                                    val sl = CharVector.map Char.toLower s
+                     p_list_sep newline
+                                (fn s =>
+                                    let
+                                        val sl = CharVector.map Char.toLower s
 
-                                    val q = "SELECT COUNT(*) FROM pg_class WHERE relname = '"
-                                            ^ sl ^ "' AND relkind = 'S'"
-                                in
-                                    box [string "res = PQexec(conn, \"",
-                                         string q,
-                                         string "\");",
-                                         newline,
-                                         newline,
-                                         string "if (res == NULL) {",
-                                         newline,
-                                         box [string "PQfinish(conn);",
-                                              newline,
-                                              string "uw_error(ctx, FATAL, \"Out of memory allocating query result.\");",
-                                              newline],
-                                         string "}",
-                                         newline,
-                                         newline,
-                                         string "if (PQresultStatus(res) != PGRES_TUPLES_OK) {",
-                                         newline,
-                                         box [string "char msg[1024];",
-                                              newline,
-                                              string "strncpy(msg, PQerrorMessage(conn), 1024);",
-                                              newline,
-                                              string "msg[1023] = 0;",
-                                              newline,
-                                              string "PQclear(res);",
-                                              newline,
-                                              string "PQfinish(conn);",
-                                              newline,
-                                              string "uw_error(ctx, FATAL, \"Query failed:\\n",
-                                              string q,
-                                              string "\\n%s\", msg);",
-                                              newline],
-                                         string "}",
-                                         newline,
-                                         newline,
-                                         string "if (strcmp(PQgetvalue(res, 0, 0), \"1\")) {",
-                                         newline,
-                                         box [string "PQclear(res);",
-                                              newline,
-                                              string "PQfinish(conn);",
-                                              newline,
-                                              string "uw_error(ctx, FATAL, \"Sequence '",
-                                              string s,
-                                              string "' does not exist.\");",
-                                              newline],
-                                         string "}",
-                                         newline,
-                                         newline,
-                                         string "PQclear(res);",
-                                         newline]
-                                end) sequences,
+                                        val q = "SELECT COUNT(*) FROM pg_class WHERE relname = '"
+                                                ^ sl ^ "' AND relkind = 'S'"
+                                    in
+                                        box [string "res = PQexec(conn, \"",
+                                             string q,
+                                             string "\");",
+                                             newline,
+                                             newline,
+                                             string "if (res == NULL) {",
+                                             newline,
+                                             box [string "PQfinish(conn);",
+                                                  newline,
+                                                  string "uw_error(ctx, FATAL, \"Out of memory allocating query result.\");",
+                                                  newline],
+                                             string "}",
+                                             newline,
+                                             newline,
+                                             string "if (PQresultStatus(res) != PGRES_TUPLES_OK) {",
+                                             newline,
+                                             box [string "char msg[1024];",
+                                                  newline,
+                                                  string "strncpy(msg, PQerrorMessage(conn), 1024);",
+                                                  newline,
+                                                  string "msg[1023] = 0;",
+                                                  newline,
+                                                  string "PQclear(res);",
+                                                  newline,
+                                                  string "PQfinish(conn);",
+                                                  newline,
+                                                  string "uw_error(ctx, FATAL, \"Query failed:\\n",
+                                                  string q,
+                                                  string "\\n%s\", msg);",
+                                                  newline],
+                                             string "}",
+                                             newline,
+                                             newline,
+                                             string "if (strcmp(PQgetvalue(res, 0, 0), \"1\")) {",
+                                             newline,
+                                             box [string "PQclear(res);",
+                                                  newline,
+                                                  string "PQfinish(conn);",
+                                                  newline,
+                                                  string "uw_error(ctx, FATAL, \"Sequence '",
+                                                  string s,
+                                                  string "' does not exist.\");",
+                                                  newline],
+                                             string "}",
+                                             newline,
+                                             newline,
+                                             string "PQclear(res);",
+                                             newline]
+                                    end) sequences,
 
-                 string "}"]
+                     string "}"]
+            else
+                string "static void uw_db_validate(uw_context ctx) { }"
 
         val hasDb = List.exists (fn (DDatabase _, _) => true | _ => false) ds