diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile | 16 | ||||
-rw-r--r-- | src/botserv.c | 34 | ||||
-rw-r--r-- | src/chanserv.c | 94 | ||||
-rw-r--r-- | src/config.c | 2 | ||||
-rw-r--r-- | src/core/ns_group.c | 10 | ||||
-rw-r--r-- | src/hostserv.c | 48 | ||||
-rw-r--r-- | src/init.c | 116 | ||||
-rw-r--r-- | src/main.c | 59 | ||||
-rw-r--r-- | src/makefile.win32 | 4 | ||||
-rw-r--r-- | src/mypasql.c | 122 | ||||
-rw-r--r-- | src/mysql.c | 1890 | ||||
-rw-r--r-- | src/news.c | 31 | ||||
-rw-r--r-- | src/nickserv.c | 164 | ||||
-rw-r--r-- | src/operserv.c | 65 | ||||
-rw-r--r-- | src/rdb.c | 496 | ||||
-rw-r--r-- | src/sessions.c | 29 |
16 files changed, 48 insertions, 3132 deletions
diff --git a/src/Makefile b/src/Makefile index 3d7122c5f..ccd6a3be2 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,15 +1,11 @@ -MYSQL_OBJ = $(MYSQL:.c=.o) -RDB_OBJ = $(RDB:.c=.o) OBJS = actions.o base64.o bots.o botserv.o channels.o chanserv.o commands.o compat.o \ config.o datafiles.o encrypt.o events.o hashcomp.o helpserv.o hostserv.o init.o ircd.o language.o log.o mail.o main.o \ memory.o memoserv.o messages.o misc.o modules.o news.o nickserv.o operserv.o \ - process.o send.o servers.o sessions.o slist.o sockutil.o timeout.o users.o \ - $(RDB_OBJ) $(MYSQL_OBJ) + process.o send.o servers.o sessions.o slist.o sockutil.o timeout.o users.o SRCS = actions.c base64.c bots.cpp botserv.c channels.c chanserv.c commands.c compat.c \ - config.c datafiles.c encrypt.c events.c hashcomp.c helpserv.c hostserv.c init.c ircd.c language.c log.c mail.c main.c \ + config.c datafiles.c encrypt.c events.c hashcomp.cpp helpserv.c hostserv.c init.c ircd.c language.c log.c mail.c main.c \ memory.c memoserv.c messages.c misc.c modules.c news.c nickserv.c operserv.c \ - process.c send.c servers.c sessions.c s sockutil.c timeout.c users.c \ - $(RDB) $(MYSQL) + process.c send.c servers.c sessions.c s sockutil.c timeout.c users.c INCLUDES = ../include/commands.h ../include/defs.h ../include/language.h \ ../include/pseudo.h ../include/sysconf.h ../include/config.h \ @@ -21,8 +17,8 @@ MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \ 'LDFLAGS=${LDFLAGS}' 'BINDEST=${BINDEST}' 'INSTALL=${INSTALL}' \ 'INCLUDEDIR=${INCLUDEDIR}' 'RM=${RM}' 'CP=${CP}' \ 'TOUCH=${TOUCH}' 'SHELL=${SHELL}' 'DATDEST=${DATDEST}' \ - 'RUNGROUP=${RUNGROUP}' 'MODULE_PATH=${MODULE_PATH}' 'MYSQL=${MYSQL}'\ - 'RDB=${RDB}' 'SHARED=${SHARED}' 'MODULEFLAGS=${MODULEFLAGS}' + 'RUNGROUP=${RUNGROUP}' 'MODULE_PATH=${MODULE_PATH}' \ + 'SHARED=${SHARED}' 'MODULEFLAGS=${MODULEFLAGS}' .c.o: @../run-cc.pl $(CC) $(CFLAGS) -I../include/ -c $< @@ -76,8 +72,6 @@ sockutil.o: sockutil.c $(INCLUDES) timeout.o: timeout.c $(INCLUDES) users.o: users.c $(INCLUDES) vsnprintf.o: vsnprintf.c $(INCLUDES) -mysql.o: mysql.c $(INCLUDES) -rdb.o: rdb.c $(INCLUDES) mod_version: mod_version.c $(INCLUDES) @../run-cc.pl $(CC) $(CDEFS) $(CFLAGS) $(MODULEFLAGS) -I../include/ -c mod_version.c diff --git a/src/botserv.c b/src/botserv.c index b1507b2e8..2aeca8249 100644 --- a/src/botserv.c +++ b/src/botserv.c @@ -531,40 +531,6 @@ void save_bs_dbase(void) /*************************************************************************/ -void save_bs_rdb_dbase(void) -{ -#ifdef USE_RDB - int i; - BotInfo *bi; - - if (!rdb_open()) - return; - - if (rdb_tag_table("anope_bs_core") == 0) { - alog("Unable to tag table 'anope_bs_core' - BotServ RDB save failed."); - rdb_close(); - return; - } - - for (i = 0; i < 256; i++) { - for (bi = botlists[i]; bi; bi = bi->next) { - if (rdb_save_bs_core(bi) == 0) { - alog("Unable to save BotInfo for %s - BotServ RDB save failed.", bi->nick); - rdb_close(); - return; - } - } - } - - if (rdb_clean_table("anope_bs_core") == 0) - alog("Unable to clean table 'anope_bs_core' - BotServ RDB save failed."); - - rdb_close(); -#endif -} - -/*************************************************************************/ - /* Inserts a bot in the bot list. I can't be much explicit mh? */ void insert_bot(BotInfo * bi) diff --git a/src/chanserv.c b/src/chanserv.c index 598982cd9..c20c39265 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -756,100 +756,6 @@ void save_cs_dbase(void) /*************************************************************************/ -void save_cs_rdb_dbase(void) -{ -#ifdef USE_RDB - int i; - ChannelInfo *ci; - - if (!rdb_open()) - return; - - if (rdb_tag_table("anope_cs_info") == 0) { - alog("Unable to tag table 'anope_cs_info' - ChanServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_tag_table("anope_cs_access") == 0) { - alog("Unable to tag table 'anope_cs_access' - ChanServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_tag_table("anope_cs_levels") == 0) { - alog("Unable to tag table 'anope_cs_levels' - ChanServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_tag_table("anope_cs_akicks") == 0) { - alog("Unable to tag table 'anope_cs_akicks' - ChanServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_tag_table("anope_cs_badwords") == 0) { - alog("Unable to tag table 'anope_cs_badwords' - ChanServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_tag_table("anope_cs_ttb") == 0) { - alog("Unable to tag table 'anope_cs_ttb' - ChanServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_tag_table_where("anope_ms_info", "serv='CHAN'") == 0) { - alog("Unable to tag table 'anope_ms_info' - ChanServ RDB save failed."); - rdb_close(); - return; - } - - for (i = 0; i < 256; i++) { - for (ci = chanlists[i]; ci; ci = ci->next) { - if (rdb_save_cs_info(ci) == 0) { - alog("Unable to save ChanInfo for %s - ChanServ RDB save failed.", ci->name); - rdb_close(); - return; - } - } /* for (chanlists[i]) */ - } /* for (i) */ - - if (rdb_clean_table("anope_cs_info") == 0) { - alog("Unable to clean table 'anope_cs_info' - ChanServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_clean_table("anope_cs_access") == 0) { - alog("Unable to clean table 'anope_cs_access' - ChanServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_clean_table("anope_cs_levels") == 0) { - alog("Unable to clean table 'anope_cs_levels' - ChanServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_clean_table("anope_cs_akicks") == 0) { - alog("Unable to clean table 'anope_cs_akicks' - ChanServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_clean_table("anope_cs_badwords") == 0) { - alog("Unable to clean table 'anope_cs_badwords' - ChanServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_clean_table("anope_cs_ttb") == 0) { - alog("Unable to clean table 'anope_cs_ttb' - ChanServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_clean_table_where("anope_ms_info", "serv='CHAN'") == 0) - alog("Unable to clean table 'anope_ms_info' - ChanServ RDB save failed."); - - rdb_close(); -#endif -} - -/*************************************************************************/ - /* Check the current modes on a channel; if they conflict with a mode lock, * fix them. * diff --git a/src/config.c b/src/config.c index 73ac09cb3..bd76ffcb1 100644 --- a/src/config.c +++ b/src/config.c @@ -277,7 +277,6 @@ char *MysqlSecure; char *MysqlSock; int MysqlRetries = 0; int MysqlRetryGap = 0; -int UseRDB = 0; int DefConLevel; static std::string DefCon1; @@ -1316,7 +1315,6 @@ Directive directives[] = { {"MysqlSock", {{PARAM_STRING, PARAM_RELOAD, &MysqlSock}}}, {"MysqlRetries", {{PARAM_POSINT, PARAM_RELOAD, &MysqlRetries}}}, {"MysqlRetryGap", {{PARAM_POSINT, PARAM_RELOAD, &MysqlRetryGap}}}, - {"UseRDB", {{PARAM_SET, PARAM_RELOAD, &UseRDB}}}, {"ModuleAutoload", {{PARAM_STRING, PARAM_RELOAD, &Modules}}}, {"ModuleDelayedAutoload", {{PARAM_STRING, PARAM_RELOAD, &ModulesDelayed}}}, diff --git a/src/core/ns_group.c b/src/core/ns_group.c index 29e5d44f4..4a31eb988 100644 --- a/src/core/ns_group.c +++ b/src/core/ns_group.c @@ -213,16 +213,6 @@ int do_group(User * u) u->na = na; na->u = u; -#ifdef USE_RDB - /* Is this really needed? Since this is a new alias it will get - * its unique id on the next update, since it was previously - * deleted by delnick. Must observe... - */ - if (rdb_open()) { - rdb_save_ns_alias(na); - rdb_close(); - } -#endif send_event(EVENT_GROUP, 1, u->nick); alog("%s: %s!%s@%s makes %s join group of %s (%s) (e-mail: %s)", s_NickServ, u->nick, u->username, u->host, u->nick, target->nick, target->nc->display, (target->nc->email ? target->nc->email : "none")); notice_lang(s_NickServ, u, NICK_GROUP_JOINED, target->nick); diff --git a/src/hostserv.c b/src/hostserv.c index cdf43889c..52dfbc0d9 100644 --- a/src/hostserv.c +++ b/src/hostserv.c @@ -314,28 +314,11 @@ char *getvIdent(char *nick) /*************************************************************************/ void delHostCore(char *nick) { -#ifdef USE_RDB - static char clause[128]; - char *q_nick; -#endif HostCore *tmp; bool found = false; tmp = findHostCore(head, nick, &found); if (found) { head = deleteHostCore(head, tmp); - -#ifdef USE_RDB - /* Reflect this change in the database right away. */ - if (rdb_open()) { - q_nick = rdb_quote(nick); - snprintf(clause, sizeof(clause), "nick='%s'", q_nick); - if (rdb_scrub_table("anope_hs_core", clause) == 0) - alog("Unable to scrub table 'anope_hs_core' - HostServ RDB update failed."); - rdb_close(); - free(q_nick); - } -#endif - } } @@ -497,37 +480,6 @@ void save_hs_dbase(void) #undef SAFE -void save_hs_rdb_dbase(void) -{ -#ifdef USE_RDB - HostCore *current; - - if (!rdb_open()) - return; - - if (rdb_tag_table("anope_hs_core") == 0) { - alog("Unable to tag table 'anope_hs_core' - HostServ RDB save failed."); - rdb_close(); - return; - } - - current = head; - while (current != NULL) { - if (rdb_save_hs_core(current) == 0) { - alog("Unable to save HostCore for %s - HostServ RDB save failed.", current->nick); - rdb_close(); - return; - } - current = current->next; - } - - if (rdb_clean_table("anope_hs_core") == 0) - alog("Unable to clean table 'anope_hs_core' - HostServ RDB save failed."); - - rdb_close(); -#endif -} - /*************************************************************************/ /* End of Load/Save Functions */ /*************************************************************************/ diff --git a/src/init.c b/src/init.c index 38f7b0c7d..6ba89f052 100644 --- a/src/init.c +++ b/src/init.c @@ -528,20 +528,6 @@ int init_secondary(int ac, char **av) hostserv_init(); helpserv_init(); -#ifdef USE_RDB - if (!rdb_init()) { - if (UseRDB) { - UseRDB = 0; - alog("Error: Disabling UseRDB due to errors with SQL"); - } - } else { - if (MysqlSecure && UseRDB) { - UseRDB = 0; - alog("Error: MySQL password are encrypted using method in MysqlSecure disabling UseRDB"); - } - } -#endif - /* load any custom modules */ modules_init(); @@ -550,56 +536,47 @@ int init_secondary(int ac, char **av) add_entropy_userkeys(); /* Load up databases */ -#ifdef USE_RDB - if (UseRDB) - rdb_load_dbases(); - /* Need a better way to handle this -dane */ - if (!UseRDB) { -#endif - load_ns_dbase(); - if (debug) - alog("debug: Loaded %s database (1/%d)", s_NickServ, - (PreNickDBName ? 8 : 7)); - if (s_HostServ) { - load_hs_dbase(); - if (debug) - alog("debug: Loaded %s database (2/%d)", s_HostServ, - (PreNickDBName ? 8 : 7)); - } else if (debug) { - alog("debug: HostServ database (2/%d) not loaded because HostServ is disabled", (PreNickDBName ? 8 : 7)); - } - if (s_BotServ) { - load_bs_dbase(); - if (debug) - alog("debug: Loaded %s database (3/%d)", s_BotServ, - (PreNickDBName ? 8 : 7)); - } else if (debug) { - alog("debug: BotServ database (3/%d) not loaded because BotServ is disabled", (PreNickDBName ? 8 : 7)); - } - load_cs_dbase(); - if (debug) - alog("debug: Loaded %s database (4/%d)", s_ChanServ, - (PreNickDBName ? 8 : 7)); - load_os_dbase(); - if (debug) - alog("debug: Loaded %s database (5/%d)", s_OperServ, - (PreNickDBName ? 8 : 7)); - load_news(); - if (debug) - alog("debug: Loaded news database (6/%d)", - (PreNickDBName ? 8 : 7)); - load_exceptions(); - if (debug) - alog("debug: Loaded exception database (7/%d)", - (PreNickDBName ? 8 : 7)); - if (PreNickDBName) { - load_ns_req_db(); - if (debug) - alog("debug: Loaded PreNick database (8/8)"); - } -#ifdef USE_RDB - } -#endif + load_ns_dbase(); + if (debug) + alog("debug: Loaded %s database (1/%d)", s_NickServ, + (PreNickDBName ? 8 : 7)); + if (s_HostServ) { + load_hs_dbase(); + if (debug) + alog("debug: Loaded %s database (2/%d)", s_HostServ, + (PreNickDBName ? 8 : 7)); + } else if (debug) { + alog("debug: HostServ database (2/%d) not loaded because HostServ is disabled", (PreNickDBName ? 8 : 7)); + } + if (s_BotServ) { + load_bs_dbase(); + if (debug) + alog("debug: Loaded %s database (3/%d)", s_BotServ, + (PreNickDBName ? 8 : 7)); + } else if (debug) { + alog("debug: BotServ database (3/%d) not loaded because BotServ is disabled", (PreNickDBName ? 8 : 7)); + } + load_cs_dbase(); + if (debug) + alog("debug: Loaded %s database (4/%d)", s_ChanServ, + (PreNickDBName ? 8 : 7)); + load_os_dbase(); + if (debug) + alog("debug: Loaded %s database (5/%d)", s_OperServ, + (PreNickDBName ? 8 : 7)); + load_news(); + if (debug) + alog("debug: Loaded news database (6/%d)", + (PreNickDBName ? 8 : 7)); + load_exceptions(); + if (debug) + alog("debug: Loaded exception database (7/%d)", + (PreNickDBName ? 8 : 7)); + if (PreNickDBName) { + load_ns_req_db(); + if (debug) + alog("debug: Loaded PreNick database (8/8)"); + } alog("Databases loaded"); @@ -626,19 +603,8 @@ int init_secondary(int ac, char **av) } /* Save the databases back to file/mysql to reflect any changes */ -#ifdef USE_RDB - if (!UseRDB) { /* Only save if we are not using remote databases - * to avoid floods. As a side effects our nice - * FFF databases won't get overwritten if the - * mysql db is broken (empty etc.) */ -#endif alog("Info: Reflecting database records."); save_databases(); -#ifdef USE_RDB - } else { - alog("Info: Not reflecting database records."); - } -#endif send_event(EVENT_CONNECT, 1, EVENT_START); /* Connect to the remote server */ diff --git a/src/main.c b/src/main.c index d70e936ba..ab658e090 100644 --- a/src/main.c +++ b/src/main.c @@ -49,10 +49,6 @@ int protocoldebug = 0; /* -protocoldebug */ char *binary_dir; /* Used to store base path for win32 restart */ #endif -#ifdef USE_RDB -int do_mysql = 0; /* use mysql ? */ -#endif - /* Set to 1 if we are to quit */ int quitting = 0; @@ -165,61 +161,6 @@ void save_databases(void) save_news(); waiting = -18; save_exceptions(); - -#ifdef USE_RDB - if (do_mysql) { - if (debug) - alog("debug: Saving RDB databases"); - waiting = -10; - waiting = -11; - save_ns_rdb_dbase(); - /* We send these PONG's when we're not syncing to avoid timeouts. - * If we send them during the sync, we fuck something up there and - * break the syncing process, resulting in lost (literally lost) - * data. -GD - * This used is_sync(serv_uplink) to check for sync states. There's - * only a minor error with this: serv_uplink doesn't exist during - * the first save. So now we check for serv_uplink only; if it - * exists we're safe. -GD - */ - if (serv_uplink) - ircdproto->SendPong(ServerName, ServerName); - waiting = -12; - save_cs_rdb_dbase(); - if (serv_uplink) - ircdproto->SendPong(ServerName, ServerName); - if (PreNickDBName) { - save_ns_req_rdb_dbase(); - if (serv_uplink) - ircdproto->SendPong(ServerName, ServerName); - waiting = -13; - } - if (s_BotServ) { - waiting = -14; - save_bs_rdb_dbase(); - if (serv_uplink) - ircdproto->SendPong(ServerName, ServerName); - } - if (s_HostServ) { - waiting = -15; - save_hs_rdb_dbase(); - if (serv_uplink) - ircdproto->SendPong(ServerName, ServerName); - } - waiting = -16; - save_os_rdb_dbase(); - if (serv_uplink) - ircdproto->SendPong(ServerName, ServerName); - waiting = -17; - save_rdb_news(); - if (serv_uplink) - ircdproto->SendPong(ServerName, ServerName); - waiting = -18; - save_rdb_exceptions(); - if (serv_uplink) - ircdproto->SendPong(ServerName, ServerName); - } -#endif waiting = -20; send_event(EVENT_DB_SAVING, 1, EVENT_STOP); } diff --git a/src/makefile.win32 b/src/makefile.win32 index 09f05acbe..39799a25a 100644 --- a/src/makefile.win32 +++ b/src/makefile.win32 @@ -22,13 +22,13 @@ OBJS = actions.obj base64.obj bots.obj botserv.obj channels.obj chanserv.obj co init.obj ircd.obj language.obj list.obj log.obj mail.obj main.obj memory.obj \ memoserv.obj messages.obj misc.obj modules.obj mod_version.obj news.obj nickserv.obj operserv.obj \ process.obj send.obj servers.obj sessions.obj slist.obj sockutil.obj \ - timeout.obj users.obj $(RDB_O) $(MYSQL_O) + timeout.obj users.obj SRCS = actions.c base64.c botserv.c bots.cpp channels.c chanserv.c commands.c compat.c \ config.c datafiles.c encrypt.c events.c helpserv.c hostserv.c init.c ircd.c \ language.c list.c log.c mail.c main.c memory.c memoserv.c messages.c misc.c \ modules.c mod_version.c news.c nickserv.c operserv.c process.c send.c servers.obj sessions.c \ - slist.c sockutil.c timeout.c users.c $(RDB_C) $(MYSQL_C) + slist.c sockutil.c timeout.c users.c ########################################################################### diff --git a/src/mypasql.c b/src/mypasql.c deleted file mode 100644 index a66850c84..000000000 --- a/src/mypasql.c +++ /dev/null @@ -1,122 +0,0 @@ -#include <winsock.h> -#include <stdio.h> -#include <mysql.h> - -MYSQL *mysql; -MYSQL_RES *result = NULL; -MYSQL_ROW row; - -int __stdcall mysql_Connect(char *server, char *user, char *pass) -{ - mysql = mysql_init(NULL); - return (int) mysql_real_connect(mysql, server, user, pass, NULL, 0, - NULL, 0); -} - -int __stdcall mysql_SelectDb(char *db) -{ - return (int) mysql_select_db(mysql, db); -} - -const char *__stdcall mysql_Error() -{ - return mysql_error(mysql); -} - -int __stdcall mysql_Query(char *query) -{ - if (result) { - mysql_free_result(result); - result = NULL; - } - return (int) mysql_real_query(mysql, query, strlen(query)); -} - -int __stdcall mysql_NumRows() -{ - if (!result) - result = mysql_store_result(mysql); - return mysql_num_rows(result); -} - -char *strip(char *str) -{ - char *c; - if ((c = strrchr(str, '\n'))) - *c = 0; - if ((c = strrchr(str, '\r'))) - *c = 0; - return str; -} - -void add_line(char **buf, char *line) -{ - int oldlen; - char *tmp; - - if (*buf != NULL) { - oldlen = strlen(*buf); - tmp = malloc(oldlen + 1); - strcpy(tmp, *buf); - *buf = realloc(*buf, oldlen + strlen(line) + 1); - strcpy(*buf, tmp); - strcat(*buf, line); - free(tmp); - } else - *buf = strdup(line); -} - -int __stdcall mysql_LoadFromFile(char *file) -{ - FILE *fd = fopen(file, "r"); - char line[1024]; - char *query = NULL; - - - if (!fd) - return 0; - while (fgets(line, 1024, fd)) { - int len; - strip(line); - len = strlen(line); - if (!*line || (*line == '-' && *(line + 1) == '-')) - continue; - else if (line[len - 1] == ';') { /* End of a query */ - line[len - 1] = 0; - add_line(&query, line); - if (mysql_real_query(mysql, query, strlen(query))) { - free(query); - return 0; - } - free(query); - query = NULL; - } - - else - add_line(&query, line); - } - return 1; -} - -int __stdcall mysql_NumFields() -{ - if (!result) - result = mysql_store_result(mysql); - return mysql_num_fields(result); -} - -int __stdcall mysql_FetchRow() -{ - if (!result) - result = mysql_store_result(mysql); - row = mysql_fetch_row(result); - return (int) row; -} - -char *__stdcall mysql_FetchField(int i) -{ - if (i >= mysql_num_fields(result)) - return NULL; - else - return row[i]; -} diff --git a/src/mysql.c b/src/mysql.c deleted file mode 100644 index db67980f4..000000000 --- a/src/mysql.c +++ /dev/null @@ -1,1890 +0,0 @@ - -/* MySQL functions. - * - * (C) 2003-2008 Anope Team - * Contact us at info@anope.org - * - * Please read COPYING and README for further details. - * - * Based on the original code of Epona by Lara. - * Based on the original code of Services by Andy Church. - * - * $Id$ - * - */ -#include "services.h" - -/*************************************************************************/ - -/* Database Global Variables */ -MYSQL *mysql; /* MySQL Handler */ -MYSQL_RES *mysql_res; /* MySQL Result */ -MYSQL_FIELD *mysql_fields; /* MySQL Fields */ -MYSQL_ROW mysql_row; /* MySQL Row */ - -int mysql_is_connected = 0; /* Are we currently connected? */ - -/*************************************************************************/ - -/* Throw a mysql error into the logs. If severity is MYSQL_ERROR, we - * also exit Anope... - */ -void db_mysql_error(int severity, char *msg) -{ - static char buf[512]; - - if (mysql_error(mysql)) { - snprintf(buf, sizeof(buf), "MySQL %s %s: %s", msg, - severity == MYSQL_WARNING ? "warning" : "error", - mysql_error(mysql)); - } else { - snprintf(buf, sizeof(buf), "MySQL %s %s", msg, - severity == MYSQL_WARNING ? "warning" : "error"); - } - - log_perror(buf); - - if (severity == MYSQL_ERROR) { - log_perror("MySQL FATAL error... aborting."); - exit(0); - } - -} - -/*************************************************************************/ - -/* Initialize the MySQL code */ -int db_mysql_init() -{ - - /* If the host is not defined, assume we don't want MySQL */ - if (!MysqlHost) { - do_mysql = 0; - alog("MySQL: has been disabled."); - return 0; - } else { - do_mysql = 1; - alog("MySQL: has been enabled."); - alog("MySQL: client version %s.", mysql_get_client_info()); - } - - /* The following configuration options are required. - * If missing disable MySQL to avoid any problems. - */ - - if ((do_mysql) && (!MysqlName || !MysqlUser)) { - do_mysql = 0; - alog("MySQL Error: Set all required configuration options."); - return 0; - } - - if (!db_mysql_open()) { - do_mysql = 0; - return 0; - } - - return 1; -} - -/*************************************************************************/ - -/* Open a connection to the mysql database. Return 0 on failure, or - * 1 on success. If this succeeds, we're guaranteed of a working - * mysql connection (unless something unexpected happens ofcourse...) - */ -int db_mysql_open() -{ - /* If MySQL is disabled, return 0 */ - if (!do_mysql) - return 0; - - /* If we are reported to be connected, ping MySQL to see if we really are - * still connected. (yes mysql_ping() returns 0 on success) - */ - if (mysql_is_connected && !mysql_ping(mysql)) - return 1; - - mysql_is_connected = 0; - - mysql = mysql_init(NULL); - if (mysql == NULL) { - db_mysql_error(MYSQL_WARNING, "Unable to create mysql object"); - return 0; - } - - if (!MysqlPort) - MysqlPort = MYSQL_DEFAULT_PORT; - - if (!mysql_real_connect(mysql, MysqlHost, MysqlUser, MysqlPass, MysqlName, MysqlPort, MysqlSock, 0)) { - log_perror("MySQL Error: Cant connect to MySQL: %s\n", mysql_error(mysql)); - return 0; - } - - mysql_is_connected = 1; - - return 1; - -} - - -/*************************************************************************/ - -/* Perform a MySQL query. Return 1 if the query succeeded and 0 if the - * query failed. Before returning failure, re-try the query a few times - * and die if it still fails. - */ -int db_mysql_query(char *sql) -{ - int lcv; - - if (!do_mysql) - return 0; - - if (debug) - alog("debug: MySQL: %s", sql); - - /* Try as many times as configured in MysqlRetries */ - for (lcv = 0; lcv < MysqlRetries; lcv++) { - if (db_mysql_open() && (mysql_query(mysql, sql) == 0)) - return 1; - - /* If we get here, we could not run the query */ - log_perror("Unable to run query: %s\n", mysql_error(mysql)); - - /* Wait for MysqlRetryGap seconds and try again */ - sleep(MysqlRetryGap); - } - - /* Unable to run the query even after MysqlRetries tries */ - db_mysql_error(MYSQL_WARNING, "query"); - - return 0; - -} - -/*************************************************************************/ - -/* Quote a string to be safely included in a query. The result of this - * function is allocated; it MUST be freed by the caller. - */ -char *db_mysql_quote(char *sql) -{ - int slen; - char *quoted; - - - if (!sql) - return sstrdup(""); - - slen = strlen(sql); - quoted = (char*)malloc((1 + (slen * 2)) * sizeof(char)); - - mysql_real_escape_string(mysql, quoted, sql, slen); - - return quoted; - -} - -/*************************************************************************/ - -/* Close the MySQL database connection. */ -int db_mysql_close() -{ - mysql_close(mysql); - - mysql_is_connected = 0; - - return 1; -} - -/*************************************************************************/ - -/* Try to execute a query and issue a warning when failed. Return 1 on - * success and 0 on failure. - */ -int db_mysql_try(const char *fmt, ...) -{ - va_list args; - static char sql[MAX_SQL_BUF]; - - va_start(args, fmt); - vsnprintf(sql, MAX_SQL_BUF, fmt, args); - va_end(args); - - if (!db_mysql_query(sql)) { - log_perror("Can't create sql query: %s", sql); - db_mysql_error(MYSQL_WARNING, "query"); - return 0; - } - - return 1; -} - -/*************************************************************************/ - -/* Return a string to insert into a SQL query. The string will, once - * evaluated by MySQL, result in a the given pass encoded in the encryption - * type selected for MysqlSecure - * - * This should be removed since Rob properly did encryption modules... -GD - */ -char *db_mysql_secure(char *pass) -{ - char epass[BUFSIZE]; - char tmp_pass[PASSMAX]; - - /* Initialize the buffer. Bug #86 */ - memset(epass, '\0', BUFSIZE); - memset(tmp_pass, '\0', PASSMAX); - - /* We couldnt decrypt the pass... */ - if (enc_decrypt(pass, tmp_pass, PASSMAX - 1) != 1) { - snprintf(epass, sizeof(epass), "'%s'", pass); - } else { /* if we could decrypt the pass */ - if (!pass) { - snprintf(epass, sizeof(epass), "''"); - } else if ((!MysqlSecure) || (strcmp(MysqlSecure, "") == 0)) { - snprintf(epass, sizeof(epass), "'%s'", tmp_pass); - } else if (strcmp(MysqlSecure, "des") == 0) { - snprintf(epass, sizeof(epass), "ENCRYPT('%s')", tmp_pass); - } else if (strcmp(MysqlSecure, "md5") == 0) { - snprintf(epass, sizeof(epass), "MD5('%s')", tmp_pass); - } else if (strcmp(MysqlSecure, "sha") == 0) { - snprintf(epass, sizeof(epass), "SHA('%s')", tmp_pass); - } else { - snprintf(epass, sizeof(epass), "ENCODE('%s','%s')", tmp_pass, - MysqlSecure); - } - } - return sstrdup(epass); -} - -/*************************************************************************/ - -/* - * NickServ Specific Secion - */ - -/*************************************************************************/ - -/* Save the given NickRequest into the database - * Return 1 on success, 0 on failure - * These tables are tagged and will be cleaned: - * - anope_ns_request - */ -int db_mysql_save_ns_req(NickRequest * nr) -{ - int ret; - char *q_nick, *q_passcode, *q_password, *q_email; - - q_nick = db_mysql_quote(nr->nick); - q_passcode = db_mysql_quote(nr->passcode); - q_password = db_mysql_quote(nr->password); - q_email = db_mysql_quote(nr->email); - - ret = db_mysql_try("UPDATE anope_ns_request " - "SET passcode = '%s', password = '%s', email = '%s', requested = %d, active = 1 " - "WHERE nick = '%s'", - q_passcode, q_password, q_email, (int) nr->requested, - q_nick); - - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT DELAYED INTO anope_ns_request " - "(nick, passcode, password, email, requested, active) " - "VALUES ('%s', '%s', '%s', '%s', %d, 1)", - q_nick, q_passcode, q_password, q_email, - (int) nr->requested); - } - - free(q_nick); - free(q_passcode); - free(q_password); - free(q_email); - - return ret; -} - -/*************************************************************************/ - -/* Save the given NickCore into the database - * Also save the access list and memo's for this user - * Return 1 on success, 0 on failure - * These tables are tagged and will be cleaned: - * - anope_ns_core - * - anope_ns_alias - * - anope_ns_access - * - anope_ms_info (serv='NICK') - */ -int db_mysql_save_ns_core(NickCore * nc) -{ - int ret; - int i; - char *q_display, *q_pass, *epass, *q_email, *q_greet, *q_url, - *q_access, *q_sender, *q_text; - - q_display = db_mysql_quote(nc->display); - q_pass = db_mysql_quote(nc->pass); - q_email = db_mysql_quote(nc->email); - q_greet = db_mysql_quote(nc->greet); - q_url = db_mysql_quote(nc->url); - - epass = db_mysql_secure(q_pass); - free(q_pass); - - /* Let's take care of the core itself */ - /* Update the existing records */ - ret = db_mysql_try("UPDATE anope_ns_core " - "SET pass = %s, email = '%s', greet = '%s', icq = %d, url = '%s', flags = %d, language = %d, accesscount = %d, memocount = %d, " - " memomax = %d, channelcount = %d, active = 1 " - "WHERE display = '%s'", - epass, q_email, q_greet, nc->icq, q_url, nc->flags, - nc->language, nc->accesscount, nc->memos.memocount, - nc->memos.memomax, nc->channelcount, - q_display); - - /* Our previous UPDATE affected no rows, therefore this is a new record */ - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT DELAYED INTO anope_ns_core " - "(display, pass, email, greet, icq, url, flags, language, accesscount, memocount, memomax, channelcount, active) " - "VALUES ('%s', %s, '%s', '%s', %d, '%s', %d, %d, %d, %d, %d, %d, %d, 1)", - q_display, epass, q_email, q_greet, nc->icq, q_url, - nc->flags, nc->language, nc->accesscount, - nc->memos.memocount, nc->memos.memomax, - nc->channelcount); - } - - /* Now let's do the access */ - for (i = 0; ret && (i < nc->accesscount); i++) { - q_access = db_mysql_quote(nc->access[i]); - - ret = db_mysql_try("UPDATE anope_ns_access " - "SET access = '%s' " - "WHERE display = '%s'", - q_access, q_display); - - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT DELAYED INTO anope_ns_access " - "(display, access) " - "VALUES ('%s','%s')", - q_display, q_access); - } - - free(q_access); - } - - /* Memos */ - for (i = 0; ret && (i < nc->memos.memocount); i++) { - q_sender = db_mysql_quote(nc->memos.memos[i].sender); - q_text = db_mysql_quote(nc->memos.memos[i].text); - - ret = db_mysql_try("UPDATE anope_ms_info " - "SET receiver = '%s', number = %d, flags = %d, time = %d, sender = '%s', text = '%s', active = 1 " - "WHERE nm_id = %d AND serv = 'NICK'", - q_display, nc->memos.memos[i].number, - nc->memos.memos[i].flags, - (int) nc->memos.memos[i].time, q_sender, q_text, - nc->memos.memos[i].id); - - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT INTO anope_ms_info " - "(receiver, number, flags, time, sender, text, serv, active) " - "VALUES ('%s', %d, %d, %d, '%s', '%s', 'NICK', 1)", - q_display, nc->memos.memos[i].number, - nc->memos.memos[i].flags, - (int) nc->memos.memos[i].time, q_sender, - q_text); - - /* This is to make sure we can UPDATE memos instead of TRUNCATE - * the table each time and then INSERT them all again. Ideally - * everything in core would have it's dbase-id stored, but that's - * something for phase 3. -GD - */ - if (ret) - nc->memos.memos[i].id = mysql_insert_id(mysql); - } - - free(q_sender); - free(q_text); - } - - free(q_display); - free(epass); - free(q_email); - free(q_greet); - free(q_url); - - return ret; -} - - -/*************************************************************************/ - -/* Save the given NickAlias into the database - * Return 1 on success, 0 on failure - * These tables are tagged and will be cleaned: - * - anope_ns_core - * - anope_ns_alias - * - anope_ns_access - * - anope_ms_info (serv='NICK') - */ -int db_mysql_save_ns_alias(NickAlias * na) -{ - int ret; - char *q_nick, *q_lastmask, *q_lastrname, *q_lastquit, *q_display; - - q_nick = db_mysql_quote(na->nick); - q_lastmask = db_mysql_quote(na->last_usermask); - q_lastrname = db_mysql_quote(na->last_realname); - q_lastquit = db_mysql_quote(na->last_quit); - q_display = db_mysql_quote(na->nc->display); - - ret = db_mysql_try("UPDATE anope_ns_alias " - "SET last_usermask = '%s', last_realname = '%s', last_quit = '%s', time_registered = %d, last_seen = %d, status = %d, " - " display = '%s', active = 1 " - "WHERE nick = '%s'", - q_lastmask, q_lastrname, q_lastquit, - (int) na->time_registered, (int) na->last_seen, - (int) na->status, q_display, q_nick); - - /* Our previous UPDATE affected no rows, therefore this is a new record */ - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT DELAYED INTO anope_ns_alias " - "(nick, last_usermask, last_realname, last_quit, time_registered, last_seen, status, display, active) " - "VALUES ('%s', '%s', '%s', '%s', %d, %d, %d, '%s', 1)", - q_nick, q_lastmask, q_lastrname, q_lastquit, - (int) na->time_registered, (int) na->last_seen, - (int) na->status, q_display); - } - - free(q_nick); - free(q_lastmask); - free(q_lastrname); - free(q_lastquit); - free(q_display); - - return ret; -} - -/*************************************************************************/ - -/* - * ChanServ Specific Secion - */ - -/*************************************************************************/ - -/* Save the given ChannelInfo into the database - * Also save the access list, levels, akicks, badwords, ttb, and memo's for this channel - * Return 1 on success, 0 on failure - * These tables are tagged and will be cleaned: - * - anope_cs_info - * - anope_cs_access - * - anope_cs_levels - * - anope_cs_akicks - * - anope_cs_badwords - * - anope_cs_ttb - * - anope_ms_info (serv='CHAN') - */ -int db_mysql_save_cs_info(ChannelInfo * ci) -{ - int ret; - int i; - char *q_name; - char *q_founder; - char *q_successor; - char *q_pass; - char *e_pass; - char *q_desc; - char *q_url; - char *q_email; - char *q_lasttopic; - char *q_lasttopicsetter; - char *q_forbidby; - char *q_forbidreason; - char *q_mlock_key; - char *q_mlock_flood; - char *q_mlock_redirect; - char *q_entrymsg; - char *q_botnick; - char *q_sender; - char *q_text; - char *q_accessdisp; - char *q_akickdisp; - char *q_akickreason; - char *q_akickcreator; - char *q_badwords; - - q_name = db_mysql_quote(ci->name); - if (ci->founder) { - q_founder = db_mysql_quote(ci->founder->display); - } else { - q_founder = db_mysql_quote(""); - } - if (ci->successor) { - q_successor = db_mysql_quote(ci->successor->display); - } else { - q_successor = db_mysql_quote(""); - } - q_pass = db_mysql_quote(ci->founderpass); - q_desc = db_mysql_quote(ci->desc); - q_url = db_mysql_quote(ci->url); - q_email = db_mysql_quote(ci->email); - q_lasttopic = db_mysql_quote(ci->last_topic); - q_lasttopicsetter = db_mysql_quote(ci->last_topic_setter); - q_forbidby = db_mysql_quote(ci->forbidby); - q_forbidreason = db_mysql_quote(ci->forbidreason); - q_mlock_key = db_mysql_quote(ci->mlock_key); - q_mlock_flood = db_mysql_quote(ci->mlock_flood); - q_mlock_redirect = db_mysql_quote(ci->mlock_redirect); - q_entrymsg = db_mysql_quote(ci->entry_message); - if (ci->bi) { - q_botnick = db_mysql_quote(ci->bi->nick); - } else { - q_botnick = db_mysql_quote(""); - } - - e_pass = db_mysql_secure(q_pass); - free(q_pass); - - /* Let's take care of the core itself */ - ret = db_mysql_try("UPDATE anope_cs_info " - "SET founder = '%s', successor = '%s', founderpass = %s, descr = '%s', url = '%s', email = '%s', time_registered = %d, " - " last_used = %d, last_topic = '%s', last_topic_setter = '%s', last_topic_time = %d, flags = %d, forbidby = '%s', " - " forbidreason = '%s', bantype = %d, accesscount = %d, akickcount = %d, mlock_on = %d, mlock_off = %d, mlock_limit = %d, " - " mlock_key = '%s', mlock_flood = '%s', mlock_redirect = '%s', entry_message = '%s', memomax = %d, botnick = '%s', botflags = %d, " - " bwcount = %d, capsmin = %d, capspercent = %d, floodlines = %d, floodsecs = %d, repeattimes = %d, active = 1 " - "WHERE name = '%s'", - q_founder, q_successor, e_pass, q_desc, q_url, q_email, - (int) ci->time_registered, (int) ci->last_used, - q_lasttopic, q_lasttopicsetter, - (int) ci->last_topic_time, (int) ci->flags, q_forbidby, - q_forbidreason, (int) ci->bantype, - (int) ci->accesscount, (int) ci->akickcount, - (int) ci->mlock_on, (int) ci->mlock_off, - (int) ci->mlock_limit, q_mlock_key, q_mlock_flood, - q_mlock_redirect, q_entrymsg, (int) ci->memos.memomax, - q_botnick, (int) ci->botflags, (int) ci->bwcount, - (int) ci->capsmin, (int) ci->capspercent, - (int) ci->floodlines, (int) ci->floodsecs, - (int) ci->repeattimes, q_name); - - /* Our previous UPDATE affected no rows, therefore this is a new record */ - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT DELAYED INTO anope_cs_info " - "(name, founder, successor, founderpass, descr, url, email, time_registered, last_used, last_topic, last_topic_setter, " - " last_topic_time, flags, forbidby, forbidreason, bantype, accesscount, akickcount, mlock_on, mlock_off, mlock_limit, " - " mlock_key, mlock_flood, mlock_redirect, entry_message, botnick, botflags, bwcount, capsmin, capspercent, floodlines, " - " floodsecs, repeattimes, active) " - "VALUES ('%s', '%s', '%s', %s, '%s', '%s', '%s', %d, %d, '%s', '%s', %d, %d, '%s', '%s', %d, %d, %d, %d, %d, %d, '%s', '%s', " - " '%s', '%s', '%s', %d, %d, %d, %d, %d, %d, %d, 1)", - q_name, q_founder, q_successor, e_pass, q_desc, - q_url, q_email, (int) ci->time_registered, - (int) ci->last_used, q_lasttopic, - q_lasttopicsetter, (int) ci->last_topic_time, - (int) ci->flags, q_forbidby, q_forbidreason, - (int) ci->bantype, (int) ci->accesscount, - (int) ci->akickcount, (int) ci->mlock_on, - (int) ci->mlock_off, (int) ci->mlock_limit, - q_mlock_key, q_mlock_flood, q_mlock_redirect, - q_entrymsg, q_botnick, (int) ci->botflags, - (int) ci->bwcount, (int) ci->capsmin, - (int) ci->capspercent, (int) ci->floodlines, - (int) ci->floodsecs, (int) ci->repeattimes); - } - - /* Memos */ - for (i = 0; ret && (i < ci->memos.memocount); i++) { - q_sender = db_mysql_quote(ci->memos.memos[i].sender); - q_text = db_mysql_quote(ci->memos.memos[i].text); - - ret = db_mysql_try("UPDATE anope_ms_info " - "SET receiver = '%s', number = %d, flags = %d, time = %d, sender = '%s', text = '%s', active = 1 " - "WHERE nm_id = %d AND serv = 'CHAN'", - q_name, ci->memos.memos[i].number, - ci->memos.memos[i].flags, - (int) ci->memos.memos[i].time, q_sender, q_text, - ci->memos.memos[i].id); - - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT INTO anope_ms_info " - "(receiver, number,flags, time, sender, text, serv, active) " - "VALUES ('%s', %d, %d, %d, '%s', '%s', 'CHAN', 1)", - q_name, ci->memos.memos[i].number, - ci->memos.memos[i].flags, - (int) ci->memos.memos[i].time, q_sender, - q_text); - - /* See comment at db_mysql_save_ns_core */ - if (ret) - ci->memos.memos[i].id = mysql_insert_id(mysql); - } - - free(q_sender); - free(q_text); - } - - /* Access */ - for (i = 0; ret && (i < ci->accesscount); i++) { - if (ci->access[i].in_use) { - q_accessdisp = db_mysql_quote(ci->access[i].nc->display); - - ret = db_mysql_try("UPDATE anope_cs_access " - "SET in_use = %d, level = %d, last_seen = %d, active = 1 " - "WHERE channel = '%s' AND display = '%s'", - (int) ci->access[i].in_use, - (int) ci->access[i].level, - (int) ci->access[i].last_seen, - q_name, q_accessdisp); - - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT DELAYED INTO anope_cs_access " - "(channel, display, in_use, level, last_seen, active) " - "VALUES ('%s', '%s', %d, %d, %d, 1)", - q_name, q_accessdisp, - (int) ci->access[i].in_use, - (int) ci->access[i].level, - (int) ci->access[i].last_seen); - } - - free(q_accessdisp); - } - } - - /* Levels */ - for (i = 0; ret && (i < CA_SIZE); i++) { - ret = db_mysql_try("UPDATE anope_cs_levels " - "SET level = %d, active = 1 " - "WHERE channel = '%s' AND position = %d", - (int) ci->levels[i], q_name, i); - - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT DELAYED INTO anope_cs_levels " - "(channel, position, level, active) " - "VALUES ('%s', %d, %d, 1)", - q_name, i, (int) ci->levels[i]); - } - } - - /* Akicks */ - for (i = 0; ret && (i < ci->akickcount); i++) { - if (ci->akick[i].flags & AK_USED) { - if (ci->akick[i].flags & AK_ISNICK) - q_akickdisp = db_mysql_quote(ci->akick[i].u.nc->display); - else - q_akickdisp = db_mysql_quote(ci->akick[i].u.mask); - - q_akickreason = db_mysql_quote(ci->akick[i].reason); - q_akickcreator = db_mysql_quote(ci->akick[i].creator); - } else { - q_akickdisp = ""; - q_akickreason = ""; - q_akickcreator = ""; - } - - ret = db_mysql_try("UPDATE anope_cs_akicks " - "SET flags = %d, reason = '%s', creator = '%s', addtime = %d, active = 1 " - "WHERE channel = '%s' AND dmask = '%s'", - (int) ci->akick[i].flags, q_akickreason, - q_akickcreator, (ci->akick[i].flags & AK_USED ? - (int) ci->akick[i].addtime : 0), - q_name, q_akickdisp); - - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT DELAYED INTO anope_cs_akicks " - "(channel, dmask, flags, reason, creator, addtime, active) " - "VALUES ('%s', '%s', %d, '%s', '%s', %d, 1)", - q_name, q_akickdisp, (int) ci->akick[i].flags, - q_akickreason, q_akickcreator, - (ci->akick[i].flags & AK_USED ? - (int) ci->akick[i].addtime : 0)); - } - - if (ci->akick[i].flags & AK_USED) { - free(q_akickdisp); - free(q_akickreason); - free(q_akickcreator); - } - } - - /* Bad Words */ - for (i = 0; ret && (i < ci->bwcount); i++) { - if (ci->badwords[i].in_use) { - q_badwords = db_mysql_quote(ci->badwords[i].word); - - ret = db_mysql_try("UPDATE anope_cs_badwords " - "SET type = %d, active = 1 " - "WHERE channel = '%s' AND word = '%s'", - (int) ci->badwords[i].type, q_name, - q_badwords); - - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT DELAYED INTO anope_cs_badwords " - "(channel, word, type, active) " - "VALUES ('%s', '%s', %d, 1)", - q_name, q_badwords, - (int) ci->badwords[i].type); - } - - free(q_badwords); - } - } - - /* TTB's */ - for (i = 0; ret && (i < TTB_SIZE); i++) { - ret = db_mysql_try("UPDATE anope_cs_ttb " - "SET value = %d, active = 1 " - "WHERE channel = '%s' AND ttb_id = %d", - ci->ttb[i], q_name, i); - - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT DELAYED INTO anope_cs_ttb " - "(channel, ttb_id, value, active) " - "VALUES ('%s', %d, %d, 1)", - q_name, i, ci->ttb[i]); - } - } - - free(q_name); - free(q_founder); - free(q_successor); - free(e_pass); - free(q_desc); - free(q_url); - free(q_email); - free(q_lasttopic); - free(q_lasttopicsetter); - free(q_mlock_key); - free(q_mlock_flood); - free(q_mlock_redirect); - free(q_entrymsg); - free(q_botnick); - free(q_forbidby); - free(q_forbidreason); - - return ret; -} - -/*************************************************************************/ - - -/* - * OperServ Specific Section - */ - -/*************************************************************************/ - -/* Save the OperServ database into MySQL - * Return 1 on success, 0 on failure - * These tables are tagged and will be cleaned: - * - anope_os_akills - * - anope_os_sglines - * - anope_os_sqlines - * - anope_os_szlines - * These tables are emptied: - * - anope_os_core - */ - -int db_mysql_save_os_db(unsigned int maxucnt, unsigned int maxutime, - SList * ak, SList * sgl, SList * sql, SList * szl) -{ - int ret; - int i; - Akill *akl; - SXLine *sl; - char *q_user; - char *q_host; - char *q_mask; - char *q_by; - char *q_reason; - - - /* First save the core info */ - ret = db_mysql_try("INSERT DELAYED INTO anope_os_core " - "(maxusercnt, maxusertime, akills_count, sglines_count, sqlines_count, szlines_count) " - "VALUES (%d, %d, %d, %d, %d, %d)", - maxucnt, maxutime, ak->count, sgl->count, sql->count, - szl->count); - - /* Next save all AKILLs */ - for (i = 0; ret && (i < ak->count); i++) { - akl = (Akill*)ak->list[i]; - q_user = db_mysql_quote(akl->user); - q_host = db_mysql_quote(akl->host); - q_by = db_mysql_quote(akl->by); - q_reason = db_mysql_quote(akl->reason); - - ret = db_mysql_try("UPDATE anope_os_akills " - "SET xby = '%s', reason = '%s', seton = %d, expire = %d, active = 1 " - "WHERE user = '%s' AND host = '%s'", - q_by, q_reason, (int) akl->seton, - (int) akl->expires, q_user, q_host); - - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT DELAYED INTO anope_os_akills " - "(user, host, xby, reason, seton, expire, active) " - "VALUES ('%s', '%s', '%s', '%s', %d, %d, 1)", - q_user, q_host, q_by, q_reason, - (int) akl->seton, (int) akl->expires); - } - - free(q_user); - free(q_host); - free(q_by); - free(q_reason); - } - - /* Time to save the SGLINEs */ - for (i = 0; ret && (i < sgl->count); i++) { - sl = (SXLine*)sgl->list[i]; - q_mask = db_mysql_quote(sl->mask); - q_by = db_mysql_quote(sl->by); - q_reason = db_mysql_quote(sl->reason); - - ret = db_mysql_try("UPDATE anope_os_sglines " - "SET xby = '%s', reason = '%s', seton = %d, expire = %d, active = 1 " - "WHERE mask = '%s'", - q_by, q_reason, (int) sl->seton, (int) sl->expires, - q_mask); - - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT DELAYED INTO anope_os_sglines " - "(mask, xby, reason, seton, expire, active) " - "VALUES ('%s', '%s', '%s', %d, %d, 1)", - q_mask, q_by, q_reason, (int) sl->seton, - (int) sl->expires); - } - - free(q_mask); - free(q_by); - free(q_reason); - } - - /* Save the SQLINEs */ - for (i = 0; ret && (i < sql->count); i++) { - sl = (SXLine*)sql->list[i]; - - q_mask = db_mysql_quote(sl->mask); - q_by = db_mysql_quote(sl->by); - q_reason = db_mysql_quote(sl->reason); - - ret = db_mysql_try("UPDATE anope_os_sqlines " - "SET xby = '%s', reason = '%s', seton = %d, expire = %d, active = 1 " - "WHERE mask = '%s'", - q_by, q_reason, (int) sl->seton, (int) sl->expires, - q_mask); - - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT DELAYED INTO anope_os_sqlines " - "(mask, xby, reason, seton, expire, active) " - "VALUES ('%s', '%s', '%s', %d, %d, 1)", - q_mask, q_by, q_reason, (int) sl->seton, - (int) sl->expires); - } - - free(q_mask); - free(q_by); - free(q_reason); - } - - /* Now save the SZLINEs */ - for (i = 0; ret && (i < szl->count); i++) { - sl = (SXLine*)szl->list[i]; - - q_mask = db_mysql_quote(sl->mask); - q_by = db_mysql_quote(sl->by); - q_reason = db_mysql_quote(sl->reason); - - ret = db_mysql_try("UPDATE anope_os_szlines " - "SET xby = '%s', reason = '%s', seton = %d, expire = %d, active = 1 " - "WHERE mask = '%s'", - q_by, q_reason, (int) sl->seton, (int) sl->expires, - q_mask); - - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT DELAYED INTO anope_os_szlines " - "(mask, xby, reason, seton, expire, active) " - "VALUES ('%s', '%s', '%s', %d, %d, 1)", - q_mask, q_by, q_reason, (int) sl->seton, - (int) sl->expires); - } - - free(q_mask); - free(q_by); - free(q_reason); - } - - return ret; -} - -/*************************************************************************/ - -/* Save the given NewsItem - * These tables are tagged and will be cleaned: - * - anope_os_news - */ -int db_mysql_save_news(NewsItem * ni) -{ - int ret; - char *q_text; - char *q_who; - - q_text = db_mysql_quote(ni->text); - q_who = db_mysql_quote(ni->who); - - ret = db_mysql_try("UPDATE anope_os_news " - "SET ntext = '%s', who = '%s', active = 1 " - "WHERE type = %d AND num = %d AND `time` = %d", - q_text, q_who, ni->type, ni->num, (int) ni->time); - - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT DELAYED INTO anope_os_news " - "(type, num, ntext, who, `time`, active) " - "VALUES (%d, %d, '%s', '%s', %d, 1)", - ni->type, ni->num, q_text, q_who, (int) ni->time); - } - - free(q_text); - free(q_who); - - return ret; -} - -/*************************************************************************/ - -/* Save the given Exception - * These tables are tagged and will be cleaned: - * - anope_os_exceptions - */ - -int db_mysql_save_exceptions(Exception * e) -{ - int ret; - char *q_mask; - char *q_who; - char *q_reason; - - q_mask = db_mysql_quote(e->mask); - q_who = db_mysql_quote(e->who); - q_reason = db_mysql_quote(e->reason); - - ret = db_mysql_try("UPDATE anope_os_exceptions " - "SET lim = %d, who = '%s', reason = '%s', `time` = %d, expires = %d, active = 1 " - "WHERE mask = '%s'", - e->limit, q_who, q_reason, (int) e->time, - (int) e->expires, q_mask); - - if (ret && (mysql_affected_rows(mysql)) == 0) { - ret = db_mysql_try("INSERT DELAYED INTO anope_os_exceptions " - "(mask, lim, who, reason, `time`, expires, active) " - "VALUES ('%s', %d, '%s', '%s', %d, %d, 1)", - q_mask, e->limit, q_who, q_reason, (int) e->time, - (int) e->expires); - } - - free(q_mask); - free(q_who); - free(q_reason); - - return ret; -} - -/*************************************************************************/ - - -/* - * HostServ Specific Section - */ - -/*************************************************************************/ - -/* Save the given HostCore - * These tables are tagged and will be cleaned: - * - anope_hs_core - */ - -int db_mysql_save_hs_core(HostCore * hc) -{ - int ret; - char *q_nick; - char *q_ident; - char *q_host; - char *q_creator; - - q_nick = db_mysql_quote(hc->nick); - q_ident = db_mysql_quote(hc->vIdent); - q_host = db_mysql_quote(hc->vHost); - q_creator = db_mysql_quote(hc->creator); - - ret = db_mysql_try("UPDATE anope_hs_core " - "SET vident = '%s', vhost = '%s', creator = '%s', `time` = %d, active = 1 " - "WHERE nick = '%s'", - q_ident, q_host, q_creator, (int) hc->time, q_nick); - - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT DELAYED INTO anope_hs_core " - "(nick, vident, vhost, creator, `time`, active) " - "VALUES ('%s', '%s', '%s', '%s', %d, 1)", - q_nick, q_ident, q_host, q_creator, - (int) hc->time); - } - - free(q_nick); - free(q_ident); - free(q_host); - free(q_creator); - - return ret; -} - -/*************************************************************************/ - -/* - * BotServ Specific Section - */ - -/*************************************************************************/ - -int db_mysql_save_bs_core(BotInfo * bi) -{ - int ret; - char *q_nick; - char *q_user; - char *q_host; - char *q_real; - - q_nick = db_mysql_quote(bi->nick); - q_user = db_mysql_quote(bi->user); - q_host = db_mysql_quote(bi->host); - q_real = db_mysql_quote(bi->real); - - ret = db_mysql_try("UPDATE anope_bs_core " - "SET user = '%s', host = '%s', rname = '%s', flags = %d, created = %d, chancount = %d, active = 1 " - "WHERE nick = '%s'", - q_user, q_host, q_real, bi->flags, (int) bi->created, - bi->chancount, q_nick); - - if (ret && (mysql_affected_rows(mysql) == 0)) { - ret = db_mysql_try("INSERT DELAYED INTO anope_bs_core " - "(nick, user, host, rname, flags, created, chancount, active) " - "VALUES ('%s', '%s', '%s', '%s', %d, %d, %d, 1)", - q_nick, q_user, q_host, q_real, bi->flags, - (int) bi->created, bi->chancount); - } - - free(q_nick); - free(q_user); - free(q_host); - free(q_real); - - return ret; -} - -/*************************************************************************/ -/*************************************************************************/ - -/* Some loading code! */ - -/*************************************************************************/ -/*************************************************************************/ - -int db_mysql_load_bs_dbase(void) -{ - int ret; - BotInfo *bi; - - if (!do_mysql) - return 0; - - ret = db_mysql_try("SELECT nick, user, host, rname, flags, created " - "FROM anope_bs_core " - "WHERE active = 1"); - - if (!ret) - return 0; - - mysql_res = mysql_use_result(mysql); - - while ((mysql_row = mysql_fetch_row(mysql_res))) { - bi = new BotInfo(mysql_row[0]); - bi->user = sstrdup(mysql_row[1]); - bi->host = sstrdup(mysql_row[2]); - bi->real = sstrdup(mysql_row[3]); - bi->flags = strtol(mysql_row[4], (char **) NULL, 10); - bi->created = strtol(mysql_row[5], (char **) NULL, 10); - bi->chancount = strtol(mysql_row[6], (char **) NULL, 10); - } - - mysql_free_result(mysql_res); - - return 1; -} - -int db_mysql_load_hs_dbase(void) -{ - int ret; - int32 time; - - if (!do_mysql) - return 0; - - ret = db_mysql_try("SELECT nick, vident, vhost, creator, `time` " - "FROM anope_hs_core " - "WHERE active = 1"); - - if (!ret) - return 0; - - mysql_res = mysql_use_result(mysql); - - while ((mysql_row = mysql_fetch_row(mysql_res))) { - time = strtol(mysql_row[4], (char **) NULL, 10); - addHostCore(mysql_row[0], mysql_row[1], mysql_row[2], mysql_row[3], - time); - } - - mysql_free_result(mysql_res); - - return 1; -} - -int db_mysql_load_news(void) -{ - int ret; - int i; - - if (!do_mysql) - return 0; - - ret = db_mysql_try("SELECT type, num, ntext, who, `time` " - "FROM anope_os_news " - "WHERE active = 1"); - - if (!ret) - return 0; - - mysql_res = mysql_store_result(mysql); - - nnews = mysql_num_rows(mysql_res); - if (nnews < 8) /* 2^3 */ - news_size = 16; /* 2^4 */ - else if (nnews >= 16384) /* 2^14 */ - news_size = 32767; /* 2^15 - 1 */ - else - news_size = 2 * nnews; - - news = (NewsItem*)scalloc(news_size, sizeof(*news)); - - i = 0; - while ((mysql_row = mysql_fetch_row(mysql_res))) { - news[i].type = strtol(mysql_row[0], (char **) NULL, 10); - news[i].num = strtol(mysql_row[1], (char **) NULL, 10); - news[i].text = sstrdup(mysql_row[2]); - snprintf(news[i].who, NICKMAX, "%s", mysql_row[3]); - news[i].time = strtol(mysql_row[4], (char **) NULL, 10); - i++; - } - - mysql_free_result(mysql_res); - - return 1; -} - -int db_mysql_load_exceptions(void) -{ - int ret; - int i; - - if (!do_mysql) - return 0; - - ret = db_mysql_try("SELECT mask, lim, who, reason, `time`, expires " - "FROM anope_os_exceptions " - "WHERE active = 1"); - - if (!ret) - return 0; - - mysql_res = mysql_store_result(mysql); - nexceptions = mysql_num_rows(mysql_res); - exceptions = (Exception*)scalloc(nexceptions, sizeof(Exception)); - - i = 0; - while ((mysql_row = mysql_fetch_row(mysql_res))) { - exceptions[i].mask = sstrdup(mysql_row[0]); - exceptions[i].limit = strtol(mysql_row[1], (char **) NULL, 10); - snprintf(exceptions[i].who, NICKMAX, "%s", mysql_row[2]); - exceptions[i].reason = sstrdup(mysql_row[3]); - exceptions[i].time = strtol(mysql_row[4], (char **) NULL, 10); - exceptions[i].expires = strtol(mysql_row[5], (char **) NULL, 10); - i++; - } - - mysql_free_result(mysql_res); - - return 1; -} - -int db_mysql_load_os_dbase(void) -{ - int ret; - Akill *ak; - SXLine *sl; - int akc, sglc, sqlc, szlc; - - if (!do_mysql) - return 0; - - ret = db_mysql_try("SELECT maxusercnt, maxusertime, akills_count, sglines_count, sqlines_count, szlines_count " - "FROM anope_os_core"); - - if (!ret) - return 0; - - mysql_res = mysql_use_result(mysql); - - if ((mysql_row = mysql_fetch_row(mysql_res))) { - maxusercnt = strtol(mysql_row[0], (char **) NULL, 10); - maxusertime = strtol(mysql_row[1], (char **) NULL, 10); - /* I'm not too happy with the idea of storing thse counts in a field - * instead of just using mysql_num_rows on the actual tables when - * filling the data. For now this will do, but it's bound to give - * problems sooner or later... (it probably does if you are looking - * at this) -GD - */ - akc = strtol(mysql_row[2], (char **) NULL, 10); - sglc = strtol(mysql_row[3], (char **) NULL, 10); - sqlc = strtol(mysql_row[4], (char **) NULL, 10); - szlc = strtol(mysql_row[5], (char **) NULL, 10); - } else { - maxusercnt = 0; - maxusertime = time(NULL); - akc = 0; - sglc = 0; - sqlc = 0; - szlc = 0; - } - - mysql_free_result(mysql_res); - - - /* Load the AKILLs */ - - ret = db_mysql_try("SELECT user, host, xby, reason, seton, expire " - "FROM anope_os_akills " - "WHERE active = 1"); - - if (!ret) - return 0; - - mysql_res = mysql_use_result(mysql); - slist_setcapacity(&akills, akc); - - while ((mysql_row = mysql_fetch_row(mysql_res))) { - ak = (Akill*)scalloc(1, sizeof(Akill)); - ak->user = sstrdup(mysql_row[0]); - ak->host = sstrdup(mysql_row[1]); - ak->by = sstrdup(mysql_row[2]); - ak->reason = sstrdup(mysql_row[3]); - ak->seton = strtol(mysql_row[4], (char **) NULL, 10); - ak->expires = strtol(mysql_row[5], (char **) NULL, 10); - slist_add(&akills, ak); - } - - mysql_free_result(mysql_res); - - - /* Load the SGLINEs */ - - ret = db_mysql_try("SELECT mask, xby, reason, seton, expire " - "FROM anope_os_sglines " - "WHERE active = 1"); - - if (!ret) - return 0; - - mysql_res = mysql_use_result(mysql); - slist_setcapacity(&sglines, sglc); - - while ((mysql_row = mysql_fetch_row(mysql_res))) { - sl = (SXLine*)scalloc(1, sizeof(SXLine)); - sl->mask = sstrdup(mysql_row[0]); - sl->by = sstrdup(mysql_row[1]); - sl->reason = sstrdup(mysql_row[2]); - sl->seton = strtol(mysql_row[3], (char **) NULL, 10); - sl->expires = strtol(mysql_row[4], (char **) NULL, 10); - slist_add(&sglines, sl); - } - - mysql_free_result(mysql_res); - - - /* Load the SQLINEs */ - - ret = db_mysql_try("SELECT mask, xby, reason, seton, expire " - "FROM anope_os_sqlines " - "WHERE active = 1"); - - if (!ret) - return 0; - - mysql_res = mysql_use_result(mysql); - slist_setcapacity(&sqlines, sqlc); - - while ((mysql_row = mysql_fetch_row(mysql_res))) { - sl = (SXLine*)scalloc(1, sizeof(SXLine)); - sl->mask = sstrdup(mysql_row[0]); - sl->by = sstrdup(mysql_row[1]); - sl->reason = sstrdup(mysql_row[2]); - sl->seton = strtol(mysql_row[3], (char **) NULL, 10); - sl->expires = strtol(mysql_row[4], (char **) NULL, 10); - slist_add(&sqlines, sl); - } - - mysql_free_result(mysql_res); - - - /* Load the SZLINEs */ - - ret = db_mysql_try("SELECT mask, xby, reason, seton, expire " - "FROM anope_os_szlines " - "WHERE active = 1"); - - if (!ret) - return 0; - - mysql_res = mysql_use_result(mysql); - slist_setcapacity(&szlines, szlc); - - while ((mysql_row = mysql_fetch_row(mysql_res))) { - sl = (SXLine*)scalloc(1, sizeof(SXLine)); - sl->mask = sstrdup(mysql_row[0]); - sl->by = sstrdup(mysql_row[1]); - sl->reason = sstrdup(mysql_row[2]); - sl->seton = strtol(mysql_row[3], (char **) NULL, 10); - sl->expires = strtol(mysql_row[4], (char **) NULL, 10); - slist_add(&szlines, sl); - } - - mysql_free_result(mysql_res); - - return 1; -} - -int db_mysql_load_cs_dbase(void) -{ - int ret; - char *q_name; - ChannelInfo *ci; - int i; - MYSQL_RES *res; - MYSQL_ROW row; - - if (!do_mysql) - return 0; - - ret = db_mysql_try("SELECT name, founder, successor, founderpass, descr, url, email, time_registered, last_used, last_topic, last_topic_setter, " - " last_topic_time, flags, forbidby, forbidreason, bantype, accesscount, akickcount, mlock_on, mlock_off, mlock_limit, " - " mlock_key, mlock_flood, mlock_redirect, entry_message, memomax, botnick, botflags, bwcount, capsmin, capspercent, floodlines, " - " floodsecs, repeattimes " - "FROM anope_cs_info " - "WHERE active = 1"); - - if (!ret) - return 0; - - /* I'd really like to use mysql_use_result here, but it'd tie up with - * all the queries being run inside each iteration... -GD - */ - mysql_res = mysql_store_result(mysql); - - while (ret && (mysql_row = mysql_fetch_row(mysql_res))) { - ci = (ChannelInfo*)scalloc(1, sizeof(ChannelInfo)); - - /* Name, founder, successor, password */ - snprintf(ci->name, CHANMAX, "%s", mysql_row[0]); - ci->founder = findcore(mysql_row[1]); - if (mysql_row[2] && *(mysql_row[2])) - ci->successor = findcore(mysql_row[2]); - else - ci->successor = NULL; - snprintf(ci->founderpass, PASSMAX, "%s", mysql_row[3]); - - /* Description, URL, email -- scalloc() initializes to 0/NULL */ - ci->desc = sstrdup(mysql_row[4]); - if (mysql_row[5] && *(mysql_row[5])) - ci->url = sstrdup(mysql_row[5]); - if (mysql_row[6] && *(mysql_row[6])) - ci->email = sstrdup(mysql_row[6]); - - /* Time registered, last used, last topic, last topic setter + time */ - ci->time_registered = strtol(mysql_row[7], (char **) NULL, 10); - ci->last_used = strtol(mysql_row[8], (char **) NULL, 10); - ci->last_topic = sstrdup(mysql_row[9]); - snprintf(ci->last_topic_setter, NICKMAX, "%s", mysql_row[10]); - ci->last_topic_time = strtol(mysql_row[11], (char **) NULL, 10); - - /* Flags, forbidden by, forbid reason, bantype - * NOTE: CI_INHABIT will be disabled in flags!! - */ - ci->flags = - strtol(mysql_row[12], (char **) NULL, 10) & ~CI_INHABIT; - ci->forbidby = sstrdup(mysql_row[13]); - ci->forbidreason = sstrdup(mysql_row[14]); - ci->bantype = strtol(mysql_row[15], (char **) NULL, 10); - - /* Accesscount, akickcount */ - ci->accesscount = strtol(mysql_row[16], (char **) NULL, 10); - ci->akickcount = strtol(mysql_row[17], (char **) NULL, 10); - - /* Mlock: on, off, limit, key, flood, redirect */ - ci->mlock_on = strtol(mysql_row[18], (char **) NULL, 10); - ci->mlock_off = strtol(mysql_row[19], (char **) NULL, 10); - ci->mlock_limit = strtol(mysql_row[20], (char **) NULL, 10); - ci->mlock_key = sstrdup(mysql_row[21]); - ci->mlock_flood = sstrdup(mysql_row[22]); - ci->mlock_redirect = sstrdup(mysql_row[23]); - - /* MemoMax, entrymessage, botinfo, botflags, badwordcount */ - ci->memos.memomax = strtol(mysql_row[25], (char **) NULL, 10); - if (mysql_row[24] && *(mysql_row[24])) - ci->entry_message = sstrdup(mysql_row[24]); - ci->bi = findbot(mysql_row[26]); - ci->botflags = strtol(mysql_row[27], (char **) NULL, 10); - ci->bwcount = strtol(mysql_row[28], (char **) NULL, 10); - - /* Capsmin, capspercent, floodlines, floodsecs, repeattimes */ - ci->capsmin = strtol(mysql_row[29], (char **) NULL, 10); - ci->capspercent = strtol(mysql_row[30], (char **) NULL, 10); - ci->floodlines = strtol(mysql_row[31], (char **) NULL, 10); - ci->floodsecs = strtol(mysql_row[32], (char **) NULL, 10); - ci->repeattimes = strtol(mysql_row[33], (char **) NULL, 10); - - - /* Get info from other tables; we'll need the channel name */ - q_name = db_mysql_quote(ci->name); - - /* Get the LEVELS list */ - ret = db_mysql_try("SELECT position, level " - "FROM anope_cs_levels " - "WHERE channel = '%s' AND active = 1", - q_name); - - if (ret) { - res = mysql_use_result(mysql); - ci->levels = (int16*)scalloc(CA_SIZE, sizeof(*ci->levels)); - reset_levels(ci); - - while ((row = mysql_fetch_row(res))) { - i = strtol(row[0], (char **) NULL, 10); - ci->levels[i] = strtol(row[1], (char **) NULL, 10); - } - - mysql_free_result(res); - } - - /* Get the channel ACCESS list */ - if (ret && (ci->accesscount > 0)) { - ci->access = (ChanAccess*)scalloc(ci->accesscount, sizeof(ChanAccess)); - - ret = db_mysql_try("SELECT level, display, last_seen " - "FROM anope_cs_access " - "WHERE channel = '%s' AND in_use = 1 AND active = 1", - q_name); - - if (ret) { - res = mysql_store_result(mysql); - - i = 0; - while ((row = mysql_fetch_row(res))) { - ci->access[i].in_use = 1; - ci->access[i].level = strtol(row[0], (char **) NULL, 10); - ci->access[i].nc = findcore(row[1]); - if (!(ci->access[i].nc)) - ci->access[i].in_use = 0; - ci->access[i].last_seen = - strtol(row[2], (char **) NULL, 10); - i++; - } - - mysql_free_result(res); - } - } - - /* Get the channel AKICK list */ - if (ret && (ci->akickcount > 0)) { - ci->akick = (AutoKick*)scalloc(ci->akickcount, sizeof(AutoKick)); - - ret = db_mysql_try("SELECT flags, dmask, reason, creator, addtime " - "FROM anope_cs_akicks " - "WHERE channel = '%s' AND active = 1 AND (flags & %d) <> 0", - q_name, AK_USED); - - if (ret) { - res = mysql_use_result(mysql); - - i = 0; - while ((row = mysql_fetch_row(res))) { - ci->akick[i].flags = strtol(row[0], (char **) NULL, 10); - if (ci->akick[i].flags & AK_ISNICK) { - ci->akick[i].u.nc = findcore(row[1]); - if (!(ci->akick[i].u.nc)) - ci->akick[i].flags &= ~AK_USED; - } else { - ci->akick[i].u.mask = sstrdup(row[1]); - } - ci->akick[i].reason = sstrdup(row[2]); - ci->akick[i].creator = sstrdup(row[3]); - ci->akick[i].addtime = strtol(row[4], (char **) NULL, 10); - i++; - } - - mysql_free_result(res); - } - } - - if (ret) { - /* Get the channel memos */ - ret = db_mysql_try("SELECT nm_id, number, flags, time, sender, text " - "FROM anope_ms_info " - "WHERE receiver = '%s' AND serv = 'CHAN' AND active = 1", - q_name); - - if (ret) { - res = mysql_store_result(mysql); - ci->memos.memocount = mysql_num_rows(res); - - if (ci->memos.memocount > 0) { - Memo *memos; - - memos = (Memo*)scalloc(ci->memos.memocount, sizeof(Memo)); - ci->memos.memos = memos; - - i = 0; - while ((row = mysql_fetch_row(res))) { - memos[i].id = strtol(row[0], (char **) NULL, 10); - memos[i].number = strtol(row[1], (char **) NULL, 10); - memos[i].flags = strtol(row[2], (char **) NULL, 10); - memos[i].time = strtol(row[3], (char **) NULL, 10); - snprintf(memos[i].sender, NICKMAX, "%s", row[4]); - memos[i].text = sstrdup(row[5]); - i++; - } - } - - mysql_free_result(res); - } - } - - /* Get the TTB data */ - if (ret) { - ci->ttb = (int16*)scalloc(TTB_SIZE, sizeof(*ci->ttb)); - - ret = db_mysql_try("SELECT ttb_id, value " - "FROM anope_cs_ttb " - "WHERE channel = '%s' AND active = 1", - q_name); - - if (ret) { - res = mysql_use_result(mysql); - - while ((row = mysql_fetch_row(res))) { - i = strtol(row[0], (char **) NULL, 10); - /* Should we do a sanity check on the value of i? -GD */ - ci->ttb[i] = strtol(row[1], (char **) NULL, 10); - } - - mysql_free_result(res); - } - } - - /* Get the badwords */ - if (ret && (ci->bwcount > 0)) { - ci->badwords = (BadWord*)scalloc(ci->bwcount, sizeof(BadWord)); - - ret = db_mysql_try("SELECT word, type " - "FROM anope_cs_badwords " - "WHERE channel = '%s' AND active = 1", - q_name); - - if (ret) { - res = mysql_use_result(mysql); - - i = 0; - while ((row = mysql_fetch_row(res))) { - ci->badwords[i].in_use = 1; - ci->badwords[i].word = sstrdup(row[0]); - ci->badwords[i].type = strtol(row[1], (char **) NULL, 10); - i++; - } - - mysql_free_result(res); - } - } - - /* YAY! all done; free q_name and insert the channel */ - free(q_name); - alpha_insert_chan(ci); - } - - mysql_free_result(mysql_res); - - /* Check to be sure that all channels still have a founder. If not, - * delete them. This code seems to be required in the old mysql code - * so i'll leave it in just to be sure. I also wonder why they didn't - * do that check up above immediately when it was known there was no - * founder... -GD - */ - for (i = 0; i < 256; i++) { - ChannelInfo *next; - for (ci = chanlists[i]; ci; ci = next) { - next = ci->next; - if (!(ci->flags & CI_VERBOTEN) && !ci->founder) { - alog("%s: database load: Deleting founderless channel %s", - s_ChanServ, ci->name); - delchan(ci); - } - } - } - - return ret; -} - -int db_mysql_load_ns_req_dbase(void) -{ - int ret; - NickRequest *nr; - - if (!do_mysql) - return 0; - - ret = db_mysql_try("SELECT nick, passcode, password, email, requested " - "FROM anope_ns_request " - "WHERE active = 1"); - - if (ret) { - mysql_res = mysql_use_result(mysql); - - while ((mysql_row = mysql_fetch_row(mysql_res))) { - nr = (NickRequest*)scalloc(1, sizeof(NickRequest)); - - nr->nick = sstrdup(mysql_row[0]); - nr->passcode = sstrdup(mysql_row[1]); - snprintf(nr->password, PASSMAX, "%s", mysql_row[2]); - nr->email = sstrdup(mysql_row[3]); - nr->requested = strtol(mysql_row[4], (char **) NULL, 10); - - insert_requestnick(nr); - } - - mysql_free_result(mysql_res); - } - - return ret; -} - -int db_mysql_load_ns_dbase(void) -{ - int ret; - char *q_display; - NickCore *nc; - NickAlias *na; - MYSQL_RES *res; - MYSQL_ROW row; - int i; - - if (!do_mysql) - return 0; - - ret = db_mysql_try("SELECT display, pass, email, icq, url, flags, language, accesscount, memocount, memomax, channelcount, greet " - "FROM anope_ns_core " - "WHERE active = 1"); - - if (!ret) - return 0; - - /* I'd really like to use mysql_use_result here, but it'd tie up with - * all the queries being run inside each iteration... -GD - */ - mysql_res = mysql_store_result(mysql); - - while (ret && (mysql_row = mysql_fetch_row(mysql_res))) { - nc = (NickCore*)scalloc(1, sizeof(NickCore)); - - /* Display, password, email, ICQ, URL, flags */ - nc->display = sstrdup(mysql_row[0]); - snprintf(nc->pass, PASSMAX, "%s", mysql_row[1]); - nc->email = sstrdup(mysql_row[2]); - nc->icq = strtol(mysql_row[3], (char **) NULL, 10); - nc->url = sstrdup(mysql_row[4]); - nc->flags = strtol(mysql_row[5], (char **) NULL, 10); - - /* Language, accesscount, memocount, memomax */ - nc->language = strtol(mysql_row[6], (char **) NULL, 10); - nc->accesscount = strtol(mysql_row[7], (char **) NULL, 10); - nc->memos.memocount = strtol(mysql_row[8], (char **) NULL, 10); - nc->memos.memomax = strtol(mysql_row[9], (char **) NULL, 10); - - /* Channelcount, greet */ - nc->channelcount = strtol(mysql_row[10], (char **) NULL, 10); - if (mysql_row[12] && *(mysql_row[12])) - nc->greet = sstrdup(mysql_row[12]); - - /* Don't allow KILL_IMMED if the config doesn't allow it */ - if (!NSAllowKillImmed) - nc->flags &= ~NI_KILL_IMMED; - - /* Check if the current user is important enough to be added to - * services admin or services oper lists - */ - if (nc->flags & NI_SERVICES_ADMIN) - slist_add(&servadmins, nc); - if (nc->flags & NI_SERVICES_OPER) - slist_add(&servopers, nc); - - /* Unset the SERVICES_ROOT flag; we will set it again later if this - * user is really a services root (checked per NickAlias) -GD - */ - nc->flags &= ~NI_SERVICES_ROOT; - - /* Get info from other tables; we'll need the display */ - q_display = db_mysql_quote(nc->display); - - /* Fill the accesslist */ - if (ret && (nc->accesscount > 0)) { - nc->access = (char**)scalloc(nc->accesscount, sizeof(char *)); - - ret = db_mysql_try("SELECT access " - "FROM anope_ns_access " - "WHERE display = '%s' AND active = 1", - q_display); - - if (ret) { - res = mysql_use_result(mysql); - - i = 0; - while ((row = mysql_fetch_row(res))) { - if (row[0] && *(row[0])) { - nc->access[i] = sstrdup(row[0]); - i++; - } - } - - mysql_free_result(res); - } - } - - /* Load the memos */ - if (ret && (nc->memos.memocount > 0)) { - nc->memos.memos = (Memo*)scalloc(nc->memos.memocount, sizeof(Memo)); - - ret = db_mysql_try("SELECT nm_id, number, flags, time, sender, text " - "FROM anope_ms_info " - "WHERE receiver = '%s' AND active = 1 AND serv = 'NICK' " - "ORDER BY number ASC", - q_display); - - if (ret) { - res = mysql_use_result(mysql); - - i = 0; - while ((row = mysql_fetch_row(res))) { - nc->memos.memos[i].id = strtol(row[0], (char **) NULL, 10); - nc->memos.memos[i].number = strtol(row[1], (char **) NULL, 10); - nc->memos.memos[i].flags = strtol(row[2], (char **) NULL, 10); - nc->memos.memos[i].time = strtol(row[3], (char **) NULL, 10); - snprintf(nc->memos.memos[i].sender, NICKMAX, "%s", row[4]); - nc->memos.memos[i].text = sstrdup(row[5]); - - i++; - } - - mysql_free_result(res); - } - } - - /* Done with the core; insert it */ - insert_core(nc); - } - - mysql_free_result(mysql_res); - - if (!ret) - return 0; - - /* Load the nickaliases */ - ret = db_mysql_try("SELECT nick, display, time_registered, last_seen, status, last_usermask, last_realname, last_quit " - "FROM anope_ns_alias " - "WHERE active = 1"); - - if (!ret) - return 0; - - mysql_res = mysql_use_result(mysql); - - while ((mysql_row = mysql_fetch_row(mysql_res))) { - /* First make sure this NickAlias has a NickCore; else we don't even - * bother adding it to the aliases at all... - */ - NickCore *nc; - - if (!(nc = findcore(mysql_row[1]))) - continue; - - na = (NickAlias*)scalloc(1, sizeof(NickAlias)); - - /* nick, time_registered, last_seen, status - * NOTE: remove NS_TEMPORARY from status on load - */ - na->nick = sstrdup(mysql_row[0]); - na->nc = nc; - na->time_registered = strtol(mysql_row[2], (char **) NULL, 10); - na->last_seen = strtol(mysql_row[3], (char **) NULL, 10); - na->status = - strtol(mysql_row[4], (char **) NULL, 10) & ~NS_TEMPORARY; - - /* last_usermask, last_realname, last_quit */ - na->last_usermask = sstrdup(mysql_row[5]); - na->last_realname = sstrdup(mysql_row[6]); - na->last_quit = sstrdup(mysql_row[7]); - - /* Assign to the nickcore aliases */ - slist_add(&na->nc->aliases, na); - - /* Check if this user is a services root */ - for (i = 0; i < RootNumber; i++) { - if (stricmp(ServicesRoots[i], na->nick) == 0) - na->nc->flags |= NI_SERVICES_ROOT; - } - - /* Last, but not least: insert the alias! */ - alpha_insert_alias(na); - } - - mysql_free_result(mysql_res); - - return ret; -} - -/* get random mysql number for the generator */ -unsigned int mysql_rand(void) -{ - unsigned int num = 0; - - if (!do_mysql) - return 0; - - db_mysql_try("SELECT RAND()"); - - mysql_res = mysql_store_result(mysql); - - if (!(mysql_row = mysql_fetch_row(mysql_res))) { - mysql_free_result(mysql_res); - return 0; - } - - num = UserKey3 * strtol(mysql_row[0], (char **) NULL, 10); - - mysql_free_result(mysql_res); - - return num; -} diff --git a/src/news.c b/src/news.c index 3fffee433..0d0cc2518 100644 --- a/src/news.c +++ b/src/news.c @@ -232,37 +232,6 @@ void save_news() #undef SAFE -void save_rdb_news() -{ -#ifdef USE_RDB - int i; - NewsItem *ni; - - if (!rdb_open()) - return; - - if (rdb_tag_table("anope_os_news") == 0) { - alog("Unable to tag table 'anope_os_news' - News RDB save failed."); - return; - } - - for (i = 0; i < nnews; i++) { - ni = &news[i]; - if (rdb_save_news(ni) == 0) { - alog("Unable to save NewsItem %d - News RDB save failed.", ni->num); - return; - } - } - - if (rdb_clean_table("anope_os_news") == 0) { - alog("Unable to clean table 'anope_os_news' - News RDB save failed."); - return; - } - - rdb_close(); -#endif -} - /*************************************************************************/ /***************************** News display ******************************/ /*************************************************************************/ diff --git a/src/nickserv.c b/src/nickserv.c index 695bd86e8..efb803393 100644 --- a/src/nickserv.c +++ b/src/nickserv.c @@ -751,113 +751,6 @@ void save_ns_req_dbase(void) #undef SAFE -void save_ns_rdb_dbase(void) -{ -#ifdef USE_RDB - int i; - NickAlias *na; - NickCore *nc; - - if (!rdb_open()) - return; - - if (rdb_tag_table("anope_ns_core") == 0) { - alog("Unable to tag 'anope_ns_core' - NickServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_tag_table("anope_ns_alias") == 0) { - alog("Unable to tag 'anope_ns_alias' - NickServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_tag_table("anope_ns_access") == 0) { - alog("Unable to tag 'anope_ns_access' - NickServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_tag_table_where("anope_ms_info", "serv='NICK'") == 0) { - alog("Unable to tag 'anope_ms_info' - NickServ RDB save failed."); - rdb_close(); - return; - } - - for (i = 0; i < 1024; i++) { - for (nc = nclists[i]; nc; nc = nc->next) { - if (rdb_save_ns_core(nc) == 0) { - alog("Unable to save NickCore for '%s' - NickServ RDB save failed.", nc->display); - rdb_close(); - return; - } - } /* for (nc) */ - } /* for (i) */ - - for (i = 0; i < 1024; i++) { - for (na = nalists[i]; na; na = na->next) { - if (rdb_save_ns_alias(na) == 0) { - alog("Unable to save NickAlias for '%s' - NickServ RDB save failed.", na->nick); - rdb_close(); - return; - } - } /* for (na) */ - } /* for (i) */ - - if (rdb_clean_table("anope_ns_core") == 0) { - alog("Unable to clean table 'anope_ns_core' - NickServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_clean_table("anope_ns_alias") == 0) { - alog("Unable to clean table 'anope_ns_alias' - NickServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_clean_table("anope_ns_access") == 0) { - alog("Unable to clean table 'anope_ns_access' - NickServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_clean_table_where("anope_ms_info", "serv='NICK'") == 0) - alog("Unable to clean table 'anope_ms_info' - NickServ RDB save failed."); - - rdb_close(); -#endif -} - -void save_ns_req_rdb_dbase(void) -{ -#ifdef USE_RDB - int i; - NickRequest *nr; - - if (!rdb_open()) - return; - - if (rdb_tag_table("anope_ns_request") == 0) { - alog("Unable to tag table 'anope_ns_request' - NickServ Request RDB save failed."); - rdb_close(); - return; - } - - for (i = 0; i < 1024; i++) { - for (nr = nrlists[i]; nr; nr = nr->next) { - if (rdb_save_ns_req(nr) == 0) { - /* Something went wrong - abort saving */ - alog("Unable to save NickRequest (nick '%s') - NickServ Request RDB save failed.", nr->nick); - rdb_close(); - return; - } - } - } - - if (rdb_clean_table("anope_ns_request") == 0) - alog("Unable to clean table 'anope_ns_request' - NickServ Request RDB save failed."); - - rdb_close(); -#endif - -} - /*************************************************************************/ /* Check whether a user is on the access list of the nick they're using If @@ -1303,19 +1196,6 @@ void change_core_display(NickCore * nc, char *newdisplay) alog("%s: changing %s nickname group display to %s", s_NickServ, nc->display, newdisplay); -#ifdef USE_RDB - /* Reflect this change in the database right away. This - * ensures that we know how to deal with this "new" nick - * on the next /OS UPDATE might need it on /NS DROP too... - */ - if (rdb_open()) { - if (rdb_ns_set_display(newdisplay, nc->display) == 0) { - alog("Unable to update display for %s - Nick Display RDB update failed.", nc->display); - } - rdb_close(); - } -#endif - /* Remove the core from the list */ if (nc->next) nc->next->prev = nc->prev; @@ -1340,10 +1220,6 @@ void change_core_display(NickCore * nc, char *newdisplay) static int delcore(NickCore * nc) { int i; -#ifdef USE_RDB - static char clause[128]; - char *q_display; -#endif /* (Hopefully complete) cleanup */ cs_remove_nick(nc); os_remove_nick(nc); @@ -1359,30 +1235,6 @@ static int delcore(NickCore * nc) /* Log .. */ alog("%s: deleting nickname group %s", s_NickServ, nc->display); -#ifdef USE_RDB - /* Reflect this change in the database right away. */ - if (rdb_open()) { - q_display = rdb_quote(nc->display); - snprintf(clause, sizeof(clause), "display='%s'", q_display); - if (rdb_scrub_table("anope_ns_access", clause) == 0) - alog("Unable to scrub table 'anope_ns_access' - RDB update failed."); - else if (rdb_scrub_table("anope_ns_core", clause) == 0) - alog("Unable to scrub table 'anope_ns_core' - RDB update failed."); - else if (rdb_scrub_table("anope_cs_access", clause) == 0) - alog("Unable to scrub table 'anope_cs_access' - RDB update failed."); - else { - /* I'm unsure how to clean up the OS ADMIN/OPER list on the db */ - /* I wish the "display" primary key would be the same on all tables */ - snprintf(clause, sizeof(clause), - "receiver='%s' AND serv='NICK'", q_display); - if (rdb_scrub_table("anope_ms_info", clause) == 0) - alog("Unable to scrub table 'anope_ms_info' - RDB update failed."); - } - rdb_close(); - free(q_display); - } -#endif - /* Now we can safely free it. */ free(nc->display); @@ -1447,10 +1299,6 @@ int delnickrequest(NickRequest * nr) int delnick(NickAlias * na) { -#ifdef USE_RDB - static char clause[128]; - char *q_nick; -#endif /* First thing to do: remove any timeout belonging to the nick we're deleting */ clean_ns_timeouts(na); @@ -1490,18 +1338,6 @@ int delnick(NickAlias * na) else nalists[HASH(na->nick)] = na->next; -#ifdef USE_RDB - /* Reflect this change in the database right away. */ - if (rdb_open()) { - q_nick = rdb_quote(na->nick); - snprintf(clause, sizeof(clause), "nick='%s'", q_nick); - if (rdb_scrub_table("anope_ns_alias", clause) == 0) - alog("Unable to scrub table 'anope_ns_alias' - RDB update failed"); - rdb_close(); - free(q_nick); - } -#endif - free(na->nick); if (na->last_usermask) free(na->last_usermask); diff --git a/src/operserv.c b/src/operserv.c index 50e3e078c..c39790418 100644 --- a/src/operserv.c +++ b/src/operserv.c @@ -497,71 +497,6 @@ void save_os_dbase(void) /*************************************************************************/ -void save_os_rdb_dbase(void) -{ -#ifdef USE_RDB - if (!rdb_open()) - return; - - if (rdb_tag_table("anope_os_akills") == 0) { - alog("Unable to tag table 'anope_os_akills' - OperServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_tag_table("anope_os_sglines") == 0) { - alog("Unable to tag table 'anope_os_sglines' - OperServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_tag_table("anope_os_sqlines") == 0) { - alog("Unable to tag table 'anope_os_sqlines' - OperServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_tag_table("anope_os_szlines") == 0) { - alog("Unable to tag table 'anope_os_szlines' - OperServ RDB save failed."); - rdb_close(); - return; - } - /* We empty anope_os_core as required */ - if (rdb_empty_table("anope_os_core") == 0) { - alog("Unable to empty table 'anope_os_core' - OperServ RDB save failed"); - rdb_close(); - return; - } - - if (rdb_save_os_db - (maxusercnt, maxusertime, &akills, &sglines, &sqlines, - &szlines) == 0) { - alog("Unable to save OperServ data - OperServ RDB save failed"); - rdb_close(); - return; - } - - if (rdb_clean_table("anope_os_akills") == 0) { - alog("Unable to clean table 'anope_os_akills' - OperServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_clean_table("anope_os_sglines") == 0) { - alog("Unable to clean table 'anope_os_sglines' - OperServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_clean_table("anope_os_sqlines") == 0) { - alog("Unable to clean table 'anope_os_sqlines' - OperServ RDB save failed."); - rdb_close(); - return; - } - if (rdb_clean_table("anope_os_szlines") == 0) - alog("Unable to clean table 'anope_os_szlines' - OperServ RDB save failed."); - - rdb_close(); -#endif -} - -/*************************************************************************/ - /* Removes the nick structure from OperServ lists. */ void os_remove_nick(NickCore * nc) diff --git a/src/rdb.c b/src/rdb.c deleted file mode 100644 index 09b2aacf4..000000000 --- a/src/rdb.c +++ /dev/null @@ -1,496 +0,0 @@ -/* RDB functions. - * - * (C) 2003-2008 Anope Team - * Contact us at info@anope.org - * - * Please read COPYING and README for further details. - * - * Based on the original code of Epona by Lara. - * Based on the original code of Services by Andy Church. - * - * $Id$ - * - */ -#include "services.h" - -/*************************************************************************/ - -/* Initialize the current RDB database engine */ -int rdb_init() -{ - -#ifdef USE_MYSQL - return db_mysql_init(); -#endif - - return 0; -} - -/*************************************************************************/ - -/* Check if RDB can be used to load/save data */ -int rdb_open() -{ - -#ifdef USE_MYSQL - return db_mysql_open(); /* db_mysql_open(); */ -#endif - - return 0; -} - -/*************************************************************************/ - -/* Strictly spoken this should close the database. However, it's not too - * efficient to close it every time after a write or so, so we just - * pretend we closed it while in reality it's still open. - */ -int rdb_close() -{ - -#ifdef USE_MYSQL - return 1; /* db_mysql_close(); */ -#endif - - return 1; -} - -/*************************************************************************/ - -/* Quote the string to be used in inclused for the current RDB database */ -char *rdb_quote(char *str) -{ -#ifdef USE_MYSQL - return db_mysql_quote(str); -#endif - - return sstrdup(str); -} - -/*************************************************************************/ - -/* Tag a table by setting the 'active' field to 0 for all rows. After an - * update, all rows with active still 0 will be deleted; this is done to - * easily delete old entries from the database. - */ -int rdb_tag_table(const char* table) -{ -#ifdef USE_MYSQL - return db_mysql_try("UPDATE %s SET active = 0", table); -#endif - - return 0; - -} - -/* Be sure to quote all user input in the clause! */ -int rdb_tag_table_where(const char* table, const char* clause) -{ -#ifdef USE_MYSQL - return db_mysql_try("UPDATE %s SET active = 0 WHERE %s", table, - clause); -#endif - - return 0; - -} - -/*************************************************************************/ - -/* Empty an entire database table */ -int rdb_empty_table(const char* table) -{ -#ifdef USE_MYSQL - return db_mysql_try("TRUNCATE TABLE %s", table); -#endif - - return 0; - -} - -/*************************************************************************/ - -/* Clean up a table with 'dirty' records (active = 0) */ -int rdb_clean_table(const char* table) -{ -#ifdef USE_MYSQL - return db_mysql_try("DELETE FROM %s WHERE active = 0", table); -#endif - - return 0; -} - -/* Be sure to quote user input in the clause! */ -int rdb_clean_table_where(const char* table, const char* clause) -{ -#ifdef USE_MYSQL - return db_mysql_try("DELETE FROM %s WHERE active = 0 AND (%s)", table, - clause); -#endif - - return 0; -} - -/*************************************************************************/ - -/* Delete specific records from a table. The clause is MySQL syntax, and - * should be all quoted up nicely in the calling code. - */ -int rdb_scrub_table(const char* table, const char* clause) -{ -#ifdef USE_MYSQL - return db_mysql_try("DELETE FROM %s WHERE %s", table, clause); -#endif - - return 0; - -} - -/*************************************************************************/ - -/* Execute a direct MySQL query. Do NOT forget to quote all user input! - * NOTE: this ideally shouldn't be used, but that's probably a phase3 utopia - */ -int rdb_direct_query(char *query) -{ - -#ifdef USE_MYSQL - alog("Direct Query: %s", query); - return db_mysql_query(query); -#endif - - return 0; - -} - -/*************************************************************************/ - -/* Update the needed tables when someone changes their display. - * The original author didn't even like this (claimed it should be in - * mysql.c), and i do agree muchly. - */ -int rdb_ns_set_display(char *newnick, char *oldnick) -{ - int ret = 0; - char *q_newnick; - char *q_oldnick; - - q_newnick = rdb_quote(newnick); - q_oldnick = rdb_quote(oldnick); - -#ifdef USE_MYSQL - /* Change the display on NS_CORE */ - ret = - db_mysql_try - ("UPDATE anope_ns_core SET display = '%s' WHERE display = '%s'", - q_newnick, q_oldnick); - - /* Change the display on NS_ALIAS for all grouped nicks */ - if (ret) - ret = - db_mysql_try - ("UPDATE anope_ns_alias SET display='%s' WHERE display='%s'", - q_newnick, q_oldnick); - - /* Change the display on ChanServ ACCESS list */ - if (ret) - ret = - db_mysql_try - ("UPDATE anope_cs_access SET display='%s' WHERE display='%s'", - q_newnick, q_oldnick); - - /* Change the display on ChanServ AKICK list */ - if (ret) - ret = - db_mysql_try - ("UPDATE anope_cs_akicks SET creator='%s' WHERE creator='%s'", - q_newnick, q_oldnick); - - /* Change the display on MemoServ sent memos -- is it required? */ - if (ret) - ret = - db_mysql_try - ("UPDATE anope_ms_info SET sender='%s' WHERE sender='%s'", - q_newnick, q_oldnick); - - /* Change the display on MemoServ received memos -- is it required? */ - if (ret) - ret = - db_mysql_try - ("UPDATE anope_ms_info SET receiver='%s' WHERE receiver='%s'", - q_newnick, q_oldnick); - - /* Change the akills set on the person's nick */ - if (ret) - ret = - db_mysql_try - ("UPDATE anope_cs_akicks SET dmask='%s' WHERE dmask='%s' AND flags & %d", - q_newnick, q_oldnick, AK_ISNICK); - - /* Change the display on NickServ ACCESS list */ - if (ret) - ret = - db_mysql_try - ("UPDATE anope_ns_access SET display='%s' WHERE display='%s'", - q_newnick, q_oldnick); - - /* No need to update anope_cs_info here as it is updated when we - * save the database. - * - * anope_hs_core is per nick, not per display; a changed display - * won't change anything there - */ - -#endif - - free(q_newnick); - free(q_oldnick); - - return ret; -} - -/*************************************************************************/ - -int rdb_save_ns_core(NickCore * nc) -{ - -#ifdef USE_MYSQL - return db_mysql_save_ns_core(nc); -#endif - - return 0; -} - -/*************************************************************************/ - -int rdb_save_ns_alias(NickAlias * na) -{ - -#ifdef USE_MYSQL - return db_mysql_save_ns_alias(na); -#endif - - return 0; -} - -/*************************************************************************/ - -int rdb_save_ns_req(NickRequest * nr) -{ - -#ifdef USE_MYSQL - return db_mysql_save_ns_req(nr); -#endif - - return 0; -} - -/*************************************************************************/ - -int rdb_save_cs_info(ChannelInfo * ci) -{ - -#ifdef USE_MYSQL - return db_mysql_save_cs_info(ci); -#endif - - return 0; -} - -/*************************************************************************/ - -int rdb_save_bs_core(BotInfo * bi) -{ - -#ifdef USE_MYSQL - return db_mysql_save_bs_core(bi); -#endif - - return 0; -} - -/*************************************************************************/ - -int rdb_save_hs_core(HostCore * hc) -{ - -#ifdef USE_MYSQL - return db_mysql_save_hs_core(hc); -#endif - - return 0; -} - -/*************************************************************************/ - -int rdb_save_os_db(unsigned int maxucnt, unsigned int maxutime, - SList * ak, SList * sgl, SList * sql, SList * szl) -{ - -#ifdef USE_MYSQL - return db_mysql_save_os_db(maxusercnt, maxusertime, ak, sgl, sql, szl); -#endif - - return 0; -} - -/*************************************************************************/ - -int rdb_save_news(NewsItem * ni) -{ - -#ifdef USE_MYSQL - return db_mysql_save_news(ni); -#endif - - return 0; -} - -/*************************************************************************/ - -int rdb_load_bs_dbase(void) -{ - -#ifdef USE_MYSQL - return db_mysql_load_bs_dbase(); -#endif - - return 0; -} - -/*************************************************************************/ - -int rdb_load_hs_dbase(void) -{ - -#ifdef USE_MYSQL - return db_mysql_load_hs_dbase(); -#endif - - return 0; -} - -/*************************************************************************/ - -int rdb_load_ns_dbase(void) -{ - -#ifdef USE_MYSQL - return db_mysql_load_ns_dbase(); -#endif - - return 0; -} - -/*************************************************************************/ - -int rdb_load_news(void) -{ - -#ifdef USE_MYSQL - return db_mysql_load_news(); -#endif - - return 0; -} - -/*************************************************************************/ - -int rdb_load_exceptions(void) -{ - -#ifdef USE_MYSQL - return db_mysql_load_exceptions(); -#endif - - return 0; -} - -/*************************************************************************/ - -int rdb_load_cs_dbase(void) -{ - -#ifdef USE_MYSQL - return db_mysql_load_cs_dbase(); -#endif - - return 0; -} - -/*************************************************************************/ - -int rdb_load_os_dbase(void) -{ - -#ifdef USE_MYSQL - return db_mysql_load_os_dbase(); -#endif - - return 0; -} - -/*************************************************************************/ - -int rdb_load_ns_req_dbase(void) -{ - -#ifdef USE_MYSQL - return db_mysql_load_ns_req_dbase(); -#endif - - return 0; -} - -/*************************************************************************/ - -#define LOAD_DBASE(num, name, func) {\ - if (!func) {\ - alog("RDB unable to load %s database (%d/8) !!!", name, num);\ - return 0;\ - }\ - if (debug)\ - alog("debug: RDB Loaded %s DataBase (%d/8)", name, num);\ -} - -int rdb_load_dbases(void) -{ - LOAD_DBASE(1, "NickServ", rdb_load_ns_dbase()); - - if (s_HostServ) { - LOAD_DBASE(2, "HostServ", rdb_load_hs_dbase()); - } - - if (s_BotServ) { - LOAD_DBASE(3, "BotServ", rdb_load_bs_dbase()); - } - - LOAD_DBASE(4, "ChanServ", rdb_load_cs_dbase()); - LOAD_DBASE(5, "OperServ", rdb_load_os_dbase()); - LOAD_DBASE(6, "News", rdb_load_news()); - LOAD_DBASE(7, "Exception", rdb_load_exceptions()); - - if (PreNickDBName) { - LOAD_DBASE(8, "PreNick", rdb_load_ns_req_dbase()); - } else if (debug) { - alog("debug: RDB No need to load PreNickDB (8/8)"); - } - - alog("RDB: All DataBases loaded."); - - return 0; -} - -/*************************************************************************/ - -int rdb_save_exceptions(Exception * e) -{ - -#ifdef USE_MYSQL - return db_mysql_save_exceptions(e); -#endif - - return 0; -} - -/* EOF */ diff --git a/src/sessions.c b/src/sessions.c index b0fee9b0c..11a802d74 100644 --- a/src/sessions.c +++ b/src/sessions.c @@ -475,35 +475,6 @@ void save_exceptions() #undef SAFE /*************************************************************************/ - -void save_rdb_exceptions() -{ -#ifdef USE_RDB - int i; - Exception *e; - - if (!rdb_open()) - return; - if (rdb_tag_table("anope_os_exceptions") == 0) { - alog("Unable to tag table 'anope_os_exceptions' - Exception RDB save failed."); - return; - } - for (i = 0; i < nexceptions; i++) { - e = &exceptions[i]; - if (rdb_save_exceptions(e) == 0) { - alog("Unable to save Exception '%s' - Exception RDB save failed.", e->mask); - return; - } - } - if (rdb_clean_table("anope_os_exceptions") == 0) { - alog("Unable to clean table 'anope_os_exceptions' - Exception RDB save failed."); - return; - } - rdb_close(); -#endif -} - -/*************************************************************************/ /************************ Exception Manipulation *************************/ /*************************************************************************/ |