diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2010-03-06 16:19:44 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2010-03-06 16:20:47 +0200 |
commit | 1c2f2ebfe42aee715d96768bd15ea0e6f949a444 (patch) | |
tree | 5fbe599fe29966322ab1ddd9a65d35a6331893d8 /src/mysql.c | |
parent | 6e2269bce3e0104fbc6cbf62ca8107ec437d77f9 (diff) | |
download | gamma-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.c | 77 |
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; } |