aboutsummaryrefslogtreecommitdiff
path: root/src/mysql.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2010-03-06 16:19:44 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2010-03-06 16:20:47 +0200
commit1c2f2ebfe42aee715d96768bd15ea0e6f949a444 (patch)
tree5fbe599fe29966322ab1ddd9a65d35a6331893d8 /src/mysql.c
parent6e2269bce3e0104fbc6cbf62ca8107ec437d77f9 (diff)
downloadgamma-1c2f2ebfe42aee715d96768bd15ea0e6f949a444.tar.gz
gamma-1c2f2ebfe42aee715d96768bd15ea0e6f949a444.tar.bz2
Provide new connection/disconnection interfaces.
* src/Makefile.am: Rename the library to libgamma-sql. * src/gsql_conn.c (sql_connect_print): Avoid coredumps on NULL values. (sql-connect): Rename to sql-connection-open and rewrite. Connection parameters are given by a single argument, which is a list of conses. Each cons is a pair (kw . value), and sets a single parameter. (sql-query): Do not use internal Guile functions. (sql-connect-close): Rename to sql-close-connection. * gsql_lib.c (gamma_parmlist_parse): New function. (gamma_cvt_string, gamma_cvt_int): New functions. * guile-sql.h (sql_iface)<connect>: Change signature. (gamma_parmdcl): New struct. (GAMMA_PARMLIST_IGNORE_UNKNOWN) (GAMMA_PARMLIST_WARN_UNKNOWN): New constants. (gamma_parmlist_parse): New proto. (gamma_cvt_string, gamma_cvt_int): New protos. * examples/whoisd.scm: Update. * src/mysql.c (s_mysql_connect): Rewrite for the new calling convention. * src/pgsql.c (s_pgsql_connect): Likewise. * src/sql.sci: Update library name. (sql-connect, sql-connect-close): New public functions.
Diffstat (limited to 'src/mysql.c')
-rw-r--r--src/mysql.c77
1 files changed, 65 insertions, 12 deletions
diff --git a/src/mysql.c b/src/mysql.c
index ac7e0f7..3d63ec3 100644
--- a/src/mysql.c
+++ b/src/mysql.c
@@ -38,36 +38,89 @@ s_mysql_free(struct sql_connect *conn)
}
static SCM
-s_mysql_connect (const char *hostname, int port,
- const char *dbname, const char *user, const char *pass,
- const char *why)
+s_mysql_connect (SCM parmlist, const char *func_name)
{
- MYSQL *mysql;
+ char *hostname = NULL;
+ int port = 0;
+ char *dbname = NULL;
+ char *user = NULL;
+ char *pass = NULL;
+ char *socket_path = NULL;
+ char *ssl_cert = NULL;
+ char *config_file = NULL;
+ char *config_group = NULL;
+ struct gamma_parmdcl dcltab[] = {
+ { "iface", NULL, NULL },
+ { "host", &hostname, gamma_cvt_string },
+ { "socket", &socket_path, gamma_cvt_string },
+ { "port", &port, gamma_cvt_int },
+ { "db", &dbname, gamma_cvt_string },
+ { "user", &user, gamma_cvt_string },
+ { "pass", &pass, gamma_cvt_string },
+ { "ssl-cert", &ssl_cert, gamma_cvt_string },
+ { "config-file", &config_file, gamma_cvt_string },
+ { "config-group", &config_group, gamma_cvt_string },
+ { NULL }
+ };
+
+ MYSQL *mysql, *mp;
SCM smob;
struct sql_connect *conn;
- const char *socket_path = NULL;
+
+ gamma_parmlist_parse (parmlist, dcltab, 0, func_name);
mysql = mysql_init(NULL);
+
if (!mysql)
scm_throw(gsql_error,
scm_list_2(scm_makfrom0str("mysql_init() failed"),
scm_makfrom0str("")));
-
- if (hostname[0] == '/') {
+
+ if (hostname && hostname[0] == '/') {
socket_path = hostname;
- hostname = "localhost";
+ hostname = strdup ("localhost");
+ }
+
+ if (config_file) {
+ mysql_options (mysql, MYSQL_READ_DEFAULT_FILE, config_file);
+ free(config_file);
+ }
+ if (config_group) {
+ mysql_options (mysql, MYSQL_READ_DEFAULT_GROUP, config_group);
+ free(config_group);
+ }
+ if (ssl_cert) {
+ mysql_ssl_set (mysql, NULL, NULL, ssl_cert, NULL, NULL);
+ free(ssl_cert);
}
- if (!mysql_real_connect(mysql, hostname,
+
+ mp = mysql_real_connect(mysql, hostname,
user, pass, dbname,
- port, socket_path, 0)) {
- SCM args = scm_list_2(scm_makfrom0str("Cannot connect to the database"),
- scm_makfrom0str(mysql_error(mysql)));
+ port, socket_path,
+ CLIENT_MULTI_RESULTS);
+ free(socket_path);
+
+ if (!mp) {
+ SCM args;
+
+ free(hostname);
+ free(user);
+ free(pass);
+ free(dbname);
+
+ args = scm_list_2(scm_makfrom0str("Cannot connect to the database"),
+ scm_makfrom0str(mysql_error(mysql)));
mysql_close(mysql);
+
scm_throw(gsql_error, args);
}
smob = sql_connect_create("mysql");
conn = (struct sql_connect *)SCM_CDR(smob);
+ conn->hostname = hostname;
+ conn->port = port;
+ conn->username = user;
+ conn->database = dbname;
conn->data = mysql;
return smob;
}

Return to:

Send suggestions and report system problems to the System administrator.