aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mysqlerl.c137
1 files changed, 73 insertions, 64 deletions
diff --git a/src/mysqlerl.c b/src/mysqlerl.c
index 08ade42..1e36b86 100644
--- a/src/mysqlerl.c
+++ b/src/mysqlerl.c
@@ -13,6 +13,77 @@
const char *QUERY_MSG = "sql_query";
+ETERM *
+handle_mysql_result(MYSQL_RES *result)
+{
+ MYSQL_FIELD *fields;
+ unsigned int i, num_fields, num_rows;
+ ETERM **cols, *ecols, **rows, *erows, *resp;
+
+ num_fields = mysql_num_fields(result);
+ fields = mysql_fetch_fields(result);
+ cols = (ETERM **)malloc(num_fields * sizeof(ETERM *));
+ for (i = 0; i < num_fields; i++) {
+ logmsg("DEBUG: cols[%d]: %s", i, fields[i].name);
+ cols[i] = erl_mk_string(fields[i].name);
+ }
+ ecols = erl_mk_list(cols, num_fields);
+
+ num_rows = mysql_num_rows(result);
+ rows = (ETERM **)malloc(num_rows * sizeof(ETERM *));
+ for (i = 0; i < num_rows; i++) {
+ ETERM **rowtup, *rt;
+ unsigned long *lengths;
+ MYSQL_ROW row;
+ unsigned int j;
+
+ row = mysql_fetch_row(result);
+ lengths = mysql_fetch_lengths(result);
+
+ rowtup = (ETERM **)malloc(num_fields * sizeof(ETERM *));
+ for (j = 0; j < num_fields; j++) {
+ logmsg("DEBUG: rows[%d][%d] (%d): '%s'", i, j, lengths[j], row[j]);
+ if (row[j])
+ rowtup[j] = erl_mk_estring(row[j], lengths[j]);
+ else
+ rowtup[j] = erl_mk_atom("NULL");
+ logmsg("DEBUG: rowtup[%d]: %d", j, rowtup[j]);
+ }
+ logmsg("DEBUG: making tuple of %d", num_fields);
+ rt = erl_mk_tuple(rowtup, num_fields);
+ if (rt == NULL) {
+ logmsg("ERROR: couldn't allocate %d-tuple", num_fields);
+ exit(3);
+ }
+ logmsg("DEBUG: copying rt");
+ rows[i] = erl_format("~w", rt);
+
+ logmsg("DEBUG: freeing row fields");
+ for (j = 0; j < num_fields; j++)
+ erl_free_term(rowtup[j]);
+ free(rowtup);
+ erl_free_term(rt);
+ }
+ logmsg("DEBUG: making row list");
+ erows = erl_mk_list(rows, num_rows);
+
+ logmsg("DEBUG: preparing response");
+ resp = erl_format("{selected, ~w, ~w}",
+ ecols, erows);
+
+ for (i = 0; i < num_fields; i++)
+ erl_free_term(cols[i]);
+ free(cols);
+ erl_free_term(ecols);
+
+ for (i = 0; i < num_rows; i++)
+ erl_free_term(rows[i]);
+ free(rows);
+ erl_free_term(erows);
+
+ return resp;
+}
+
void
handle_sql_query(MYSQL *dbh, ETERM *cmd)
{
@@ -32,70 +103,8 @@ handle_sql_query(MYSQL *dbh, ETERM *cmd)
result = mysql_store_result(dbh);
if (result) {
- MYSQL_FIELD *fields;
- unsigned int i, num_fields, num_rows;
- ETERM **cols, *ecols, **rows, *erows;
-
- num_fields = mysql_num_fields(result);
- fields = mysql_fetch_fields(result);
- cols = (ETERM **)malloc(num_fields * sizeof(ETERM *));
- for (i = 0; i < num_fields; i++) {
- logmsg("DEBUG: cols[%d]: %s", i, fields[i].name);
- cols[i] = erl_mk_string(fields[i].name);
- }
- ecols = erl_mk_list(cols, num_fields);
-
- num_rows = mysql_num_rows(result);
- rows = (ETERM **)malloc(num_rows * sizeof(ETERM *));
- for (i = 0; i < num_rows; i++) {
- ETERM **rowtup, *rt;
- unsigned long *lengths;
- MYSQL_ROW row;
- unsigned int j;
-
- row = mysql_fetch_row(result);
- lengths = mysql_fetch_lengths(result);
-
- rowtup = (ETERM **)malloc(num_fields * sizeof(ETERM *));
- for (j = 0; j < num_fields; j++) {
- logmsg("DEBUG: rows[%d][%d] (%d): '%s'", i, j, lengths[j], row[j]);
- if (row[j])
- rowtup[j] = erl_mk_estring(row[j], lengths[j]);
- else
- rowtup[j] = erl_mk_atom("NULL");
- logmsg("DEBUG: rowtup[%d]: %d", j, rowtup[j]);
- }
- logmsg("DEBUG: making tuple of %d", num_fields);
- rt = erl_mk_tuple(rowtup, num_fields);
- if (rt == NULL) {
- logmsg("ERROR: couldn't allocate %d-tuple", num_fields);
- exit(3);
- }
- logmsg("DEBUG: copying rt");
- rows[i] = erl_format("~w", rt);
-
- logmsg("DEBUG: freeing row fields");
- for (j = 0; j < num_fields; j++)
- erl_free_term(rowtup[j]);
- free(rowtup);
- erl_free_term(rt);
- }
- logmsg("DEBUG: making row list");
- erows = erl_mk_list(rows, num_rows);
-
- logmsg("DEBUG: preparing response");
- resp = erl_format("{selected, ~w, ~w}",
- ecols, erows);
-
- for (i = 0; i < num_fields; i++)
- erl_free_term(cols[i]);
- free(cols);
- erl_free_term(ecols);
-
- for (i = 0; i < num_rows; i++)
- erl_free_term(rows[i]);
- free(rows);
- erl_free_term(erows);
+ resp = handle_mysql_result(result);
+ mysql_free_result(result);
} else {
if (mysql_field_count(dbh) == 0)
resp = erl_format("{num_rows, ~i}", mysql_affected_rows(dbh));