summaryrefslogtreecommitdiff
path: root/src/mysql.sml
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adamc@hcoop.net>2009-07-16 18:10:29 -0400
committerGravatar Adam Chlipala <adamc@hcoop.net>2009-07-16 18:10:29 -0400
commitc01c7e97334a180b55b11a1bba93cf046628948d (patch)
treee68fb2c7ffcd8dd34ff69f24a48de2ada1c06684 /src/mysql.sml
parent4289cd07dd2467dfbad297cf21ad7cfaedc08f2b (diff)
Demo working with MySQL
Diffstat (limited to 'src/mysql.sml')
-rw-r--r--src/mysql.sml70
1 files changed, 52 insertions, 18 deletions
diff --git a/src/mysql.sml b/src/mysql.sml
index 439e8444..e6d42687 100644
--- a/src/mysql.sml
+++ b/src/mysql.sml
@@ -1,4 +1,4 @@
-(* Copyright (c) 2008-2009, Adam Chlipala
+(* Copyright (c) 2009, Adam Chlipala
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -376,7 +376,21 @@ fun init {dbstring, prepared = ss, tables, views, sequences} =
string "void uw_client_init(void) {",
newline,
- box [string "if (mysql_library_init(0, NULL, NULL)) {",
+ box [string "uw_sqlfmtInt = \"%lld%n\";",
+ newline,
+ string "uw_sqlfmtFloat = \"%g%n\";",
+ newline,
+ string "uw_Estrings = 0;",
+ newline,
+ string "uw_sqlsuffixString = \"\";",
+ newline,
+ string "uw_sqlsuffixBlob = \"\";",
+ newline,
+ string "uw_sqlfmtUint4 = \"%u%n\";",
+ newline,
+ newline,
+
+ string "if (mysql_library_init(0, NULL, NULL)) {",
newline,
box [string "fprintf(stderr, \"Could not initialize MySQL library\\n\");",
newline,
@@ -867,7 +881,7 @@ fun query {loc, cols, doCols} =
string "uw_pop_cleanup(ctx);",
newline]
-fun queryPrepared {loc, id, query, inputs, cols, doCols} =
+fun queryPrepared {loc, id, query, inputs, cols, doCols, nested} =
box [string "uw_conn *conn = uw_get_db(ctx);",
newline,
string "MYSQL_BIND in[",
@@ -901,18 +915,25 @@ fun queryPrepared {loc, id, query, inputs, cols, doCols} =
| _ => buffers t,
newline]
end) inputs,
- string "MYSQL_STMT *stmt = conn->p",
- string (Int.toString id),
- string ";",
- newline,
- newline,
- string "if (stmt == NULL) {",
- newline,
+ if nested then
+ box [string "MYSQL_STMT *stmt;",
+ newline]
+ else
+ box [string "MYSQL_STMT *stmt = conn->p",
+ string (Int.toString id),
+ string ";",
+ newline,
+ newline,
+
+ string "if (stmt == NULL) {",
+ newline],
+
box [string "stmt = mysql_stmt_init(conn->conn);",
newline,
string "if (stmt == NULL) uw_error(ctx, FATAL, \"Out of memory allocating prepared statement\");",
newline,
+ string "uw_push_cleanup(ctx, (void (*)(void *))mysql_stmt_close, stmt);",
string "if (mysql_stmt_prepare(stmt, \"",
string (String.toString query),
string "\", ",
@@ -929,12 +950,18 @@ fun queryPrepared {loc, id, query, inputs, cols, doCols} =
newline],
string "}",
newline,
- string "conn->p",
- string (Int.toString id),
- string " = stmt;",
- newline],
- string "}",
- newline,
+ if nested then
+ box []
+ else
+ box [string "conn->p",
+ string (Int.toString id),
+ string " = stmt;",
+ newline]],
+ if nested then
+ box []
+ else
+ box [string "}",
+ newline],
newline,
string "memset(in, 0, sizeof in);",
@@ -1086,7 +1113,13 @@ fun queryPrepared {loc, id, query, inputs, cols, doCols} =
queryCommon {loc = loc, cols = cols, doCols = doCols, query = box [string "\"",
string (String.toString query),
- string "\""]}]
+ string "\""]},
+
+ if nested then
+ box [string "uw_pop_cleanup(ctx);",
+ newline]
+ else
+ box []]
fun dmlCommon {loc, dml} =
box [string "if (mysql_stmt_execute(stmt)) uw_error(ctx, FATAL, \"",
@@ -1402,6 +1435,7 @@ val () = addDbms {name = "mysql",
supportsDeleteAs = false,
createSequence = fn s => "CREATE TABLE " ^ s ^ " (id INTEGER PRIMARY KEY AUTO_INCREMENT)",
textKeysNeedLengths = true,
- supportsNextval = false}
+ supportsNextval = false,
+ supportsNestedPrepared = false}
end