]> jfr.im git - irc/quakenet/newserv.git/blobdiff - noperserv/noperserv_db.c
docs: Change section title.
[irc/quakenet/newserv.git] / noperserv / noperserv_db.c
index b2bb95f2cc326da8358f228ed0f7958dc63a5c98..17e77c4d841f97eef864992733cd3b33b4e8ec15 100644 (file)
 #include "../core/error.h"
 #include "../lib/irc_string.h"
 #include "../core/schedule.h"
+#include "../dbapi2/dbapi2.h"
 
 #include "noperserv.h"
-#include "noperserv_psql.h"
 #include "noperserv_db.h"
 
-#include <libpq-fe.h>
 #include <stdlib.h>
 
-int dontclose = 0;
-int odb_connected = 0; /* seperate from the db one */
+int db_loaded = 0;
 unsigned long loadedusers = 0;
 
 unsigned long lastuserid;
 
 no_autheduser *authedusers = NULL;
 
+void noperserv_create_tables(void);
+
 void noperserv_free_user(no_autheduser *au);
-void noperserv_load_users(PGconn *dbconn, void *arg);
+void noperserv_load_users(const DBAPIResult *res, void *arg);
 
 void noperserv_check_nick(nick *np);
 void noperserv_nick_account(int hooknum, void *arg);
 void noperserv_quit_account(int hooknum, void *arg);
 
 void nopserserv_delete_from_autheduser(nick *np, no_autheduser *au);
-void noperserv_create_tables(void);
 
-void noperserv_load_db(void) {
-  if(odb_connected) {
-    dontclose = 1;
-    noperserv_cleanup_db();
-  } else {
-    if(noperserv_connect_db(&noperserv_create_tables)) {
-      Error("noperserv", ERR_ERROR, "Unable to connect to database!");
-      return;
-    }
+static DBAPIConn *nodb;
 
-    odb_connected = 1;
+int noperserv_load_db(void) {
+  if(!nodb) {
+    nodb = dbapi2open(DBAPI2_DEFAULT, "noperserv");
+    if(!nodb) {
+      Error("noperserv", ERR_STOP, "Could not connect to database.");
+      return 0;
+    }
   }
 
+  db_loaded = 1;
+
   authedusers = NULL;
 
-  noperserv_async_query(noperserv_load_users, NULL,
-    "SELECT ID, authname, flags, noticelevel FROM users");
+  noperserv_create_tables();
+
+  nodb->query(nodb, noperserv_load_users, NULL,
+    "SELECT ID, authname, flags, noticelevel FROM ?", "T", "users");
+
+  return 1;
 }
 
-void noperserv_load_users(PGconn *dbconn, void *arg) {
-  PGresult *pgres = PQgetResult(dbconn);
-  int rows, i;
+void noperserv_load_users(const DBAPIResult *res, void *arg) {
   no_autheduser *nu;
   nick *np;
+  int i;
+
+  if(!res)
+    return;
 
-  if(PQresultStatus(pgres) != PGRES_TUPLES_OK) {
+  if(!res->success) {
     Error("noperserv", ERR_ERROR, "Error loading user list.");
-    return; 
+    res->clear(res);
+    return;
   }
 
-  rows = PQntuples(pgres);
   lastuserid = 0;
 
-  for(i=0;i<rows;i++) {
-    nu = noperserv_new_autheduser(PQgetvalue(pgres, i, 1));
+  while(res->next(res)) {
+    nu = noperserv_new_autheduser(res->get(res, 1));
     if(!nu)
       continue;
 
-    nu->id = strtoul(PQgetvalue(pgres, i, 0), NULL, 10);
-    nu->authlevel = strtoul(PQgetvalue(pgres, i, 2), NULL, 10);
-    nu->noticelevel = strtoul(PQgetvalue(pgres, i, 3), NULL, 10);
+    nu->id = strtoul(res->get(res, 0), NULL, 10);
+    nu->authlevel = strtoul(res->get(res, 2), NULL, 10);
+    nu->noticelevel = strtoul(res->get(res, 3), NULL, 10);
     nu->newuser = 0;
     if(nu->id > lastuserid)
       lastuserid = nu->id;
   }
 
-  Error("noperserv", ERR_INFO, "Loaded %d users", loadedusers);
+  Error("noperserv", ERR_INFO, "Loaded %lu users", loadedusers);
   
   for(i=0;i<NICKHASHSIZE;i++)
     for(np=nicktable[i];np;np=np->next)
@@ -93,16 +98,18 @@ void noperserv_load_users(PGconn *dbconn, void *arg) {
   registerhook(HOOK_NICK_ACCOUNT, &noperserv_nick_account);
   registerhook(HOOK_NICK_NEWNICK, &noperserv_nick_account);
   registerhook(HOOK_NICK_LOSTNICK, &noperserv_quit_account);
+
+  res->clear(res);
 }
 
 void noperserv_create_tables(void) {
-  noperserv_sync_query(
-    "CREATE TABLE users ("
+  nodb->createtable(nodb, NULL, NULL,
+    "CREATE TABLE ? ("
       "ID            INT               NOT NULL,"
-      "authname      VARCHAR(%d)       NOT NULL,"
+      "authname      VARCHAR(?)       NOT NULL,"
       "flags         INT               NOT NULL,"
       "noticelevel   INT               NOT NULL,"
-      "PRIMARY KEY (ID))", ACCOUNTLEN);
+      "PRIMARY KEY (ID))", "Td", "users", ACCOUNTLEN);
 }
 
 void noperserv_cleanup_db(void) {
@@ -119,11 +126,8 @@ void noperserv_cleanup_db(void) {
     ap = np;
   }
 
-  /* other stuff */
-  if(!dontclose && odb_connected)
-    noperserv_disconnect_db();
-
-  dontclose = 0;
+  nodb->close(nodb);
+  nodb = NULL;
 }
 
 no_autheduser *noperserv_new_autheduser(char *authname) {
@@ -151,7 +155,7 @@ void noperserv_delete_autheduser(no_autheduser *au) {
   no_autheduser *ap = authedusers, *lp = NULL;
 
   if(!au->newuser)
-    noperserv_query("DELETE FROM users WHERE id = %d", au->id);
+    nodb->squery(nodb, "DELETE FROM ? WHERE id = ?", "Tu", "users", au->id);
 
   for(;ap;lp=ap,ap=ap->next) {
     if(ap == au) {
@@ -168,12 +172,10 @@ void noperserv_delete_autheduser(no_autheduser *au) {
 
 void noperserv_update_autheduser(no_autheduser *au) {
   if(au->newuser) {
-    char escapedauthname[ACCOUNTLEN * 2 + 1];
-    PQescapeString(escapedauthname, au->authname->content, au->authname->length);
-    noperserv_query("INSERT INTO users (id, authname, flags, noticelevel) VALUES (%lu,'%s',%lu,%lu)", au->id, au->authname->content, NOGetAuthLevel(au), NOGetNoticeLevel(au));
+    nodb->squery(nodb, "INSERT INTO ? (id, authname, flags, noticelevel) VALUES (?,?,?,?)", "Tusuu", "users", au->id, au->authname->content, NOGetAuthLevel(au), NOGetNoticeLevel(au));
     au->newuser = 0;
   } else {
-    noperserv_query("UPDATE users SET flags = %lu, noticelevel = %lu WHERE id = %lu", NOGetAuthLevel(au), NOGetNoticeLevel(au), au->id);
+    nodb->squery(nodb, "UPDATE ? SET flags = ?, noticelevel = ? WHERE id = ?", "Tuuu", "users", NOGetAuthLevel(au), NOGetNoticeLevel(au), au->id);
   }
 }