#define DB_NULLIDENTIFIER 0
#define DB_CREATE 1
+#define DB_CALL 2
#ifdef DBAPI_OVERRIDE
#undef USE_DBAPI_PGSQL
#define dbgetvalue(result, column) pqgetvalue(result, column)
#define dbclear(result) pqclear(result)
+#define dbcall(id, handler, tag, function, ...) pqasyncqueryf(id, handler, tag, (handler) == NULL ? DB_CALL : 0, "SELECT %s(%s)", function , ##__VA_ARGS__)
#endif /* DBAPI_PGSQL */
#define dbclear(result) sqliteclear(result)
+#define dbcall(...) abort() /* HA */
+
#endif /* DBAPI_SQLITE */
#endif /* BUILDING_DBAPI */
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,
.quotestring = dbapi2_adapter_quotestring,
.tablename = dbapi2_adapter_tablename,
+
+ .call = dbapi2_adapter_call,
};
struct DBAPI2AdapterQueryCallback {
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);
+}
+
db->__loadtable(db, init, data, fini, tag, db->tablename(db, tablename));
}
+static void dbcall(const DBAPIConn *db, DBAPIQueryCallback cb, DBAPIUserData data, const char *function, const char *format, const char *types, ...) {
+ va_list ap;
+ char buf[QUERYBUFLEN];
+
+ va_start(ap, types);
+ dbvsnprintf(db, buf, sizeof(buf), format, types, ap);
+ va_end(ap);
+
+ db->__call(db, cb, data, function, buf);
+}
+
+static void dbsimplecall(const DBAPIConn *db, const char *function, const char *format, const char *types, ...) {
+ va_list ap;
+ char buf[QUERYBUFLEN];
+
+ va_start(ap, types);
+ dbvsnprintf(db, buf, sizeof(buf), format, types, ap);
+ va_end(ap);
+
+ db->__call(db, NULL, NULL, function, buf);
+}
+
DBAPIConn *dbapi2open(const char *provider, const char *database) {
int i, found = -1;
DBAPIConn *db;
db->unsafequery = dbunsafequery;
db->unsafesquery = dbunsafesimplequery;
db->unsafecreatetable = dbunsafecreatetable;
+ db->call = dbcall;
+ db->scall = dbsimplecall;
db->__query = p->query;
db->__close = p->close;
db->__quotestring = p->quotestring;
db->__createtable = p->createtable;
db->__loadtable = p->loadtable;
+ db->__call = p->call;
strlcpy(db->name, database, DBNAME_LEN);
typedef void (*DBAPIQuery)(const struct DBAPIConn *, DBAPIQueryCallback, DBAPIUserData, const char *, ...) __attribute__ ((format (printf, 4, 5)));
typedef void (*DBAPISimpleQuery)(const struct DBAPIConn *, const char *, ...) __attribute__ ((format (printf, 2, 3)));
typedef void (*DBAPIQueryV)(const struct DBAPIConn *, DBAPIQueryCallback, DBAPIUserData, const char *);
+typedef void (*DBAPICallV)(const struct DBAPIConn *, DBAPIQueryCallback, DBAPIUserData, const char *, const char *);
typedef void (*DBAPICreateTable)(const struct DBAPIConn *, DBAPIQueryCallback, DBAPIUserData, const char *, ...) __attribute__ ((format (printf, 4, 5)));
typedef void (*DBAPICreateTableV)(const struct DBAPIConn *, DBAPIQueryCallback, DBAPIUserData, const char *);
typedef void (*DBAPILoadTable)(const struct DBAPIConn *, DBAPIQueryCallback, DBAPIQueryCallback, DBAPIQueryCallback, DBAPIUserData, const char *);
typedef void (*DBAPIEscapeString)(const struct DBAPIConn *, char *, const char *, size_t);
typedef int (*DBAPIQuoteString)(const struct DBAPIConn *, char *, size_t, const char *, size_t);
+typedef void (*DBAPICall)(const struct DBAPIConn *, DBAPIQueryCallback, DBAPIUserData, const char *, const char *, const char *, ...);
+typedef void (*DBAPISimpleCall)(const struct DBAPIConn *, const char *, const char *, const char *, ...);
typedef char *(*DBAPITableName)(const struct DBAPIConn *, const char *);
DBAPIEscapeString escapestring;
DBAPIQuoteString quotestring;
+ DBAPICallV call;
/* private members */
struct DBAPIProviderData *__providerdata;
DBAPISafeSimpleQuery squery;
DBAPISafeCreateTable createtable;
+ DBAPICall call;
+ DBAPISimpleCall scall;
+
char name[DBNAME_LEN+1];
void *handle;
DBAPIQueryV __query;
DBAPICreateTableV __createtable;
DBAPILoadTable __loadtable;
+ DBAPICallV __call;
} DBAPIConn;
typedef char *(*DBAPIResultGet)(const struct DBAPIResult *, unsigned int);
if(queryhead->identifier != QH_ALREADYFIRED) {
switch(PQresultStatus(res)) {
case PGRES_TUPLES_OK:
- Error("pqsql", ERR_WARNING, "Unhandled tuples output (query: %s)", queryhead->query);
+ if(!(queryhead->flags & DB_CALL))
+ Error("pqsql", ERR_WARNING, "Unhandled tuples output (query: %s)", queryhead->query);
break;
case PGRES_NONFATAL_ERROR: