aboutsummaryrefslogtreecommitdiff
path: root/src/gsql_lib.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/gsql_lib.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/gsql_lib.c')
-rw-r--r--src/gsql_lib.c65
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()
{

Return to:

Send suggestions and report system problems to the System administrator.