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/gsql_lib.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/gsql_lib.c')
-rw-r--r-- | src/gsql_lib.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/gsql_lib.c b/src/gsql_lib.c index a6103b2..842d09a 100644 --- a/src/gsql_lib.c +++ b/src/gsql_lib.c @@ -39,6 +39,71 @@ scm_makenum (unsigned long val) } #endif +static struct gamma_parmdcl * +find_parmdcl(struct gamma_parmdcl *dcl, const char *name) +{ + for (; dcl->name; dcl++) + if (strcmp(dcl->name, name) == 0) + return dcl; + return 0; +} + +void +gamma_parmlist_parse(SCM parmlist, struct gamma_parmdcl *dcltab, + int flags, const char *func_name) +{ + SCM elt; + + for (elt = parmlist; elt != SCM_EOL; elt = SCM_CDR(elt)) { + SCM pair = SCM_CAR(elt); + SCM kw; + char *str; + struct gamma_parmdcl *p; + + SCM_ASSERT(scm_is_pair(pair), pair, SCM_ARG1, func_name); + + kw = SCM_CAR(pair); + SCM_ASSERT(scm_is_keyword(kw), kw, SCM_ARG1, func_name); + + str = scm_to_locale_string + (scm_symbol_to_string(scm_keyword_to_symbol(kw))); + + p = find_parmdcl(dcltab, str); + free(str); + if (!p) { + if (flags & GAMMA_PARMLIST_IGNORE_UNKNOWN) + continue; + if (flags & GAMMA_PARMLIST_WARN_UNKNOWN) { + scm_simple_format + (scm_current_error_port (), + scm_makfrom0str("~S: undefined keyword: ~S~%"), + scm_list_2(scm_makfrom0str(func_name), + kw)); + continue; + } + scm_misc_error(func_name, + "Unknown keyword: ~S", + scm_list_1(kw)); + } + if (p->cvt) + p->cvt(SCM_CDR(pair), p->valptr, func_name); + } +} + +void +gamma_cvt_string(SCM inval, void *outval, const char *func_name) +{ + SCM_ASSERT(scm_is_string(inval), inval, SCM_ARGn, func_name); + *(char**)outval = scm_to_locale_string(inval); +} + +void +gamma_cvt_int(SCM inval, void *outval, const char *func_name) +{ + SCM_ASSERT(scm_is_number(inval), inval, SCM_ARGn, func_name); + *(int*)outval = scm_to_int(inval); +} + extern void sql_init() { |