summaryrefslogtreecommitdiff
path: root/src/postgres.sml
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adamc@hcoop.net>2009-12-13 14:20:41 -0500
committerGravatar Adam Chlipala <adamc@hcoop.net>2009-12-13 14:20:41 -0500
commitb225596addee1a3cfd6c3189cff923e7f0e8f7c9 (patch)
tree14b2deefac4e078e2d5e4e5bdd076749de8659d8 /src/postgres.sml
parent1063981355a5a041793c095c6fd89b91fa0bd579 (diff)
Initializers and setval
Diffstat (limited to 'src/postgres.sml')
-rw-r--r--src/postgres.sml43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/postgres.sml b/src/postgres.sml
index 51e856db..c4bbb067 100644
--- a/src/postgres.sml
+++ b/src/postgres.sml
@@ -867,6 +867,48 @@ fun nextvalPrepared {loc, id, query} =
string (String.toString query),
string "\""]}]
+fun setvalCommon {loc, query} =
+ box [string "if (res == NULL) uw_error(ctx, FATAL, \"Out of memory allocating setval result.\");",
+ newline,
+ newline,
+
+ string "if (PQresultStatus(res) != PGRES_TUPLES_OK) {",
+ newline,
+ box [string "PQclear(res);",
+ newline,
+ string "uw_error(ctx, FATAL, \"",
+ string (ErrorMsg.spanToString loc),
+ string ": Query failed:\\n%s\\n%s\", ",
+ query,
+ string ", PQerrorMessage(conn));",
+ newline],
+ string "}",
+ newline,
+ newline,
+
+ string "PQclear(res);",
+ newline]
+
+fun setval {loc, seqE, count} =
+ let
+ val query = box [string "uw_Basis_strcat(ctx, \"SELECT SETVAL('\", uw_Basis_strcat(ctx, ",
+ seqE,
+ string ", uw_Basis_strcat(ctx, \"', \", uw_Basis_strcat(ctx, uw_Basis_sqlifyInt(ctx, ",
+ count,
+ string "), \")\"))))"]
+ in
+ box [string "char *query = ",
+ query,
+ string ";",
+ newline,
+ string "PGconn *conn = uw_get_db(ctx);",
+ newline,
+ string "PGresult *res = PQexecParams(conn, query, 0, NULL, NULL, NULL, NULL, 0);",
+ newline,
+ newline,
+ setvalCommon {loc = loc, query = string "query"}]
+ end
+
fun sqlifyString s = "E'" ^ String.translate (fn #"'" => "\\'"
| #"\\" => "\\\\"
| ch =>
@@ -892,6 +934,7 @@ val () = addDbms {name = "postgres",
dmlPrepared = dmlPrepared,
nextval = nextval,
nextvalPrepared = nextvalPrepared,
+ setval = setval,
sqlifyString = sqlifyString,
p_cast = p_cast,
p_blank = p_blank,