]> jfr.im git - irc/quakenet/newserv.git/blobdiff - dbapi2/dbapi2-adapter.inc
Merge pull request #1 from meeb/meeb
[irc/quakenet/newserv.git] / dbapi2 / dbapi2-adapter.inc
index 245ad9d0482798dcf7a0ebfc7cce4a3aaf043390..794ae0d2c0cfb920c41caba0e7e55360efd15feb 100644 (file)
@@ -8,6 +8,9 @@
 
 #include "../dbapi2/dbapi2.h"
 #include "../lib/stringbuf.h"
+#include "../lib/version.h"
+
+#include <string.h>
 
 static DBAPI2_HANDLE *dbapi2_adapter_new(const DBAPIConn *);
 static void dbapi2_adapter_close(DBAPIConn *);
@@ -21,6 +24,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,
@@ -33,6 +38,8 @@ static DBAPIProvider adapterprovider = {
   .quotestring = dbapi2_adapter_quotestring,
 
   .tablename = dbapi2_adapter_tablename,
+
+  .call = dbapi2_adapter_call,
 };
 
 struct DBAPI2AdapterQueryCallback {
@@ -89,12 +96,17 @@ static DBAPIResult *wrapresult(DBAPIResult *r, DBConn *c) {
   if(!c)
     return NULL;
 
-  if(!r)
+  if(!r) {
     r = calloc(1, sizeof(DBAPIResult));
+  } else {
+    memset(r, 0, sizeof(DBAPIResult));
+  }
 
   r->clear = dbapi2_adapter_result_clear;
   r->handle = dbgetresult(c);
 
+  r->affected = dbnumaffected(c, r->handle);
+
   if(!dbquerysuccessful(r->handle))
     return r;
 
@@ -142,9 +154,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) {
@@ -156,10 +167,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);
 }
@@ -210,3 +220,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);
+}
+