]> jfr.im git - irc/quakenet/newserv.git/blobdiff - dbapi2/dbapi2-adapter.inc
DBAPI2: add support for stored procedures
[irc/quakenet/newserv.git] / dbapi2 / dbapi2-adapter.inc
index 45d1948b636c088d89e3378971f33a038c5d9362..cfb555a3d9e4ab90f04484cd5043ff42b2bd64cf 100644 (file)
@@ -22,6 +22,8 @@ static int dbapi2_adapter_quotestring(const DBAPIConn *, char *, size_t, const c
 
 static char *dbapi2_adapter_tablename(const DBAPIConn *, const char *);
 
+static void dbapi2_adapter_call(const DBAPIConn *, DBAPIQueryCallback, DBAPIUserData, const char *, const char *);
+
 static DBAPIProvider adapterprovider = {
   .new = dbapi2_adapter_new,
   .close = dbapi2_adapter_close,
@@ -34,6 +36,8 @@ static DBAPIProvider adapterprovider = {
   .quotestring = dbapi2_adapter_quotestring,
 
   .tablename = dbapi2_adapter_tablename,
+
+  .call = dbapi2_adapter_call,
 };
 
 struct DBAPI2AdapterQueryCallback {
@@ -143,9 +147,8 @@ static void dbapi2_adapter_createtable(const DBAPIConn *db, DBAPIQueryCallback c
 
 static void dbapi2_adapter_loadtablewrapper_init(DBConn *c, void *data) {
   struct DBAPI2AdapterLoadTableCallback *a = data;
-  DBAPIResult r;
 
-  a->init(wrapresult(&r, c), a->data);
+  a->init(NULL, a->data);
 }
 
 static void dbapi2_adapter_loadtablewrapper_data(DBConn *c, void *data) {
@@ -157,10 +160,9 @@ static void dbapi2_adapter_loadtablewrapper_data(DBConn *c, void *data) {
 
 static void dbapi2_adapter_loadtablewrapper_fini(DBConn *c, void *data) {
   struct DBAPI2AdapterLoadTableCallback *a = data;
-  DBAPIResult r;
 
   if(a->fini)
-    a->fini(wrapresult(&r, c), a->data);
+    a->fini(NULL, a->data);
 
   free(a);
 }
@@ -211,3 +213,22 @@ static char *dbapi2_adapter_tablename(const DBAPIConn *db, const char *tablename
   return buf;
 }
 #endif
+
+static void dbapi2_adapter_call(const DBAPIConn *db, DBAPIQueryCallback cb, DBAPIUserData data, const char *function, const char *query) {
+  struct DBAPI2AdapterQueryCallback *a;
+  char buf[512];
+
+  if(cb) {
+    a = malloc(sizeof(struct DBAPI2AdapterQueryCallback));
+
+    a->db = db;
+    a->data = data;
+    a->callback = cb;
+  } else {
+    a = NULL;
+  }
+
+  snprintf(buf, sizeof(buf), "%s", db->tablename(db, function));
+  dbcall((int)(long)db->handle, cb?dbapi2_adapter_querywrapper:NULL, a, buf, query);
+}
+