X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/8dcc76a0994e46a2bf4955a51a85880180e6861a..3898f97325dbed800d4b424e68a0c2858b8d8be7:/dbapi2/dbapi2.c diff --git a/dbapi2/dbapi2.c b/dbapi2/dbapi2.c index 9a641fe2..21256480 100644 --- a/dbapi2/dbapi2.c +++ b/dbapi2/dbapi2.c @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include "../core/error.h" #include "../lib/strlfunc.h" @@ -145,6 +147,32 @@ static void dbsafesimplequery(const DBAPIConn *db, const char *format, const cha db->__query(db, NULL, NULL, buf); } +static void dbloadtable(const DBAPIConn *db, DBAPIQueryCallback init, DBAPIQueryCallback data, DBAPIQueryCallback fini, DBAPIUserData tag, const char *tablename) { + 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; @@ -185,17 +213,21 @@ DBAPIConn *dbapi2open(const char *provider, const char *database) { db->query = dbsafequery; db->createtable = dbsafecreatetable; db->squery = dbsafesimplequery; - db->loadtable = p->loadtable; + db->loadtable = dbloadtable; db->escapestring = p->escapestring; db->tablename = p->tablename; 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); @@ -229,6 +261,9 @@ static void dbvsnprintf(const DBAPIConn *db, char *buf, size_t size, const char unsigned int u; size_t l; int fallthrough; + time_t t; + unsigned long ul; + long _l; for(i=0;i (VSNPF_MAXARGLEN / 2)) || !db->__quotestring(db, cb, sizeof(convbuf[0]), s, l)) { + if(!s) { + strlcpy(cb, "NULL", sizeof(convbuf[0])); + } else if((l > (VSNPF_MAXARGLEN / 2)) || !db->__quotestring(db, cb, sizeof(convbuf[0]), s, l)) { + /* now... this is a guess, but we should catch it most of the time */ Error("dbapi2", ERR_STOP, "Long string truncated, format: '%s', database: %s", format, db->name); l = VSNPF_MAXARGLEN; } @@ -281,6 +319,18 @@ static void dbvsnprintf(const DBAPIConn *db, char *buf, size_t size, const char u = va_arg(ap, unsigned int); snprintf(cb, VSNPF_MAXARGLEN, "%u", u); break; + case 't': + t = va_arg(ap, time_t); + snprintf(cb, VSNPF_MAXARGLEN, "%jd", (intmax_t)t); + break; + case 'D': + _l = va_arg(ap, long); + snprintf(cb, VSNPF_MAXARGLEN, "%ld", _l); + break; + case 'U': + ul = va_arg(ap, unsigned long); + snprintf(cb, VSNPF_MAXARGLEN, "%lu", ul); + break; case 'g': g = va_arg(ap, double); snprintf(cb, VSNPF_MAXARGLEN, "%.1f", g);