diff options
author | geniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b <geniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864> | 2006-12-23 13:25:01 +0000 |
---|---|---|
committer | geniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b <geniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864> | 2006-12-23 13:25:01 +0000 |
commit | 6e7add309dd9d985666e1107bd5c840faa881137 (patch) | |
tree | 8d8313bcb0d1ca4e7b2ffe8cdc4597d88498cd38 /src/mysql.c | |
parent | ee5559be07a5c5de2d870f3bc27cd2fb95b9f30b (diff) |
BUILD : 1.7.17 (1209) BUGS : NOTES : Another batch of changes regarding RDB/MySQL; all functions are now doing proper error reporting; errors are not yet handled properly
git-svn-id: svn://svn.anope.org/anope/trunk@1209 31f1291d-b8d6-0310-a050-a5561fc1590b
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@928 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src/mysql.c')
-rw-r--r-- | src/mysql.c | 1207 |
1 files changed, 680 insertions, 527 deletions
diff --git a/src/mysql.c b/src/mysql.c index c5016aa2a..99f147bff 100644 --- a/src/mysql.c +++ b/src/mysql.c @@ -89,7 +89,7 @@ int db_mysql_init() /*************************************************************************/ /* Open a connection to the mysql database. Return 0 on failure, or - * 0 on success. If this succeeds, we're guaranteed of a working + * 1 on success. If this succeeds, we're guaranteed of a working * mysql connection (unless something unexpected happens ofcourse...) */ int db_mysql_open() @@ -98,10 +98,14 @@ int db_mysql_open() if (!do_mysql) return 0; - /* If we're already connected, return 1 */ - if (mysql_is_connected) + /* 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"); @@ -110,23 +114,10 @@ int db_mysql_open() if (!MysqlPort) MysqlPort = MYSQL_DEFAULT_PORT; - - if (MysqlSock) { - 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; - } - } else { - if ((!mysql_real_connect - (mysql, MysqlHost, MysqlUser, MysqlPass, MysqlName, MysqlPort, - NULL, 0))) { - log_perror("MySQL Error: Cant connect to MySQL: %s\n", - mysql_error(mysql)); - return 0; - } + + 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; @@ -135,48 +126,39 @@ int db_mysql_open() } + /*************************************************************************/ -/* Perform a MySQL query. Return 0 if the query succeeded, or something - * else, like 1, if it failed. Before returning failure, re-try the - * query a few times and die if it fails after a few tries. +/* 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) { - /* Error is 1 */ - return 1; - } + if (!do_mysql) + return 0; - if (debug) { + 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))) { - - /* Success is 0 */ - return 0; - - } + 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 */ - db_mysql_error(MYSQL_ERROR, "query"); + /* Unable to run the query even after MysqlRetries tries */ + db_mysql_error(MYSQL_WARNING, "query"); - /* Error is 1 */ - return 1; + return 0; } @@ -198,6 +180,7 @@ char *db_mysql_quote(char *sql) quoted = malloc((1 + (slen * 2)) * sizeof(char)); mysql_real_escape_string(mysql, quoted, sql, slen); + return quoted; } @@ -216,8 +199,10 @@ int db_mysql_close() /*************************************************************************/ -/* Try to execute a query and issue a warning when failed */ -void db_mysql_try(const char *fmt, ...) +/* 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]; @@ -226,10 +211,13 @@ void db_mysql_try(const char *fmt, ...) vsnprintf(sql, MAX_SQL_BUF, fmt, args); va_end(args); - if (db_mysql_query(sql)) { + if (!db_mysql_query(sql)) { log_perror("Can't create sql query: %s", sql); - db_mysql_error(MYSQL_ERROR, "query"); + db_mysql_error(MYSQL_WARNING, "query"); + return 0; } + + return 1; } /*************************************************************************/ @@ -237,6 +225,8 @@ void db_mysql_try(const char *fmt, ...) /* 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) { @@ -278,11 +268,13 @@ char *db_mysql_secure(char *pass) /*************************************************************************/ /* 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 */ -void db_mysql_save_ns_req(NickRequest * nr) +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); @@ -290,36 +282,42 @@ void db_mysql_save_ns_req(NickRequest * nr) q_password = db_mysql_quote(nr->password); q_email = db_mysql_quote(nr->email); - 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); + 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 (mysql_affected_rows(mysql) == 0) { - 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); - } + 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') */ -void db_mysql_save_ns_core(NickCore * nc) +int db_mysql_save_ns_core(NickCore * nc) { + int ret; int i; char **access; Memo *memos; @@ -337,70 +335,74 @@ void db_mysql_save_ns_core(NickCore * nc) /* Let's take care of the core itself */ /* Update the existing records */ - 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, channelmax = %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, - nc->channelmax, q_display); + 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, channelmax = %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, nc->channelmax, + q_display); /* Our previous UPDATE affected no rows, therefore this is a new record */ - if (mysql_affected_rows(mysql) == 0) { - db_mysql_try - ("INSERT DELAYED INTO anope_ns_core (display, pass, email, greet, icq, " - "url, flags, language, accesscount, memocount, memomax, " - "channelcount, channelmax, 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, nc->channelmax); + 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, channelmax, 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, nc->channelmax); } /* Now let's do the access */ - for (i = 0; i < nc->accesscount; i++) { + for (i = 0; ret && (i < nc->accesscount); i++) { q_access = db_mysql_quote(nc->access[i]); - db_mysql_try - ("UPDATE anope_ns_access SET access = '%s' WHERE display = '%s'", - q_access, q_display); + ret = db_mysql_try("UPDATE anope_ns_access " + "SET access = '%s' " + "WHERE display = '%s'", + q_access, q_display); - if (mysql_affected_rows(mysql) == 0) { - db_mysql_try - ("INSERT DELAYED INTO anope_ns_access (display, access) " - "VALUES ('%s','%s')", q_display, q_access); + 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; i < nc->memos.memocount; i++) { + 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); - 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 (mysql_affected_rows(mysql) == 0) { - 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); + 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 */ - nc->memos.memos[i].id = mysql_insert_id(mysql); + if (ret) + nc->memos.memos[i].id = mysql_insert_id(mysql); } free(q_sender); @@ -412,20 +414,24 @@ void db_mysql_save_ns_core(NickCore * nc) 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') */ -void db_mysql_save_ns_alias(NickAlias * na) +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); @@ -434,22 +440,22 @@ void db_mysql_save_ns_alias(NickAlias * na) q_lastquit = db_mysql_quote(na->last_quit); q_display = db_mysql_quote(na->nc->display); - 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); + 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 (mysql_affected_rows(mysql) == 0) { - 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); + 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); @@ -457,6 +463,8 @@ void db_mysql_save_ns_alias(NickAlias * na) free(q_lastrname); free(q_lastquit); free(q_display); + + return ret; } /*************************************************************************/ @@ -469,6 +477,7 @@ void db_mysql_save_ns_alias(NickAlias * na) /* 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 @@ -478,8 +487,9 @@ void db_mysql_save_ns_alias(NickAlias * na) * - anope_cs_ttb * - anope_ms_info (serv='CHAN') */ -void db_mysql_save_cs_info(ChannelInfo * ci) +int db_mysql_save_cs_info(ChannelInfo * ci) { + int ret; int i; Memo *memos; char *q_name; @@ -540,78 +550,76 @@ void db_mysql_save_cs_info(ChannelInfo * ci) free(q_pass); /* Let's take care of the core itself */ - 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); + 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 (mysql_affected_rows(mysql) == 0) { - 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); + 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; i < ci->memos.memocount; i++) { + 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); - 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 (mysql_affected_rows(mysql) == 0) { - 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); + 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 */ - ci->memos.memos[i].id = mysql_insert_id(mysql); + if (ret) + ci->memos.memos[i].id = mysql_insert_id(mysql); } free(q_sender); @@ -619,41 +627,49 @@ void db_mysql_save_cs_info(ChannelInfo * ci) } /* Access */ - for (i = 0; i < ci->accesscount; i++) { + for (i = 0; ret && (i < ci->accesscount); i++) { if (ci->access[i].in_use) { q_accessdisp = db_mysql_quote(ci->access[i].nc->display); - 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 (mysql_affected_rows(mysql) == 0) { - 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); + + 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; i < CA_SIZE; i++) { - 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 (mysql_affected_rows(mysql) == 0) { - 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]); + 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; i < ci->akickcount; i++) { + 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); @@ -668,22 +684,22 @@ void db_mysql_save_cs_info(ChannelInfo * ci) q_akickcreator = ""; } - 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 (mysql_affected_rows(mysql) == 0) { - 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)); + 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) { @@ -694,19 +710,22 @@ void db_mysql_save_cs_info(ChannelInfo * ci) } /* Bad Words */ - for (i = 0; i < ci->bwcount; i++) { + for (i = 0; ret && (i < ci->bwcount); i++) { if (ci->badwords[i].in_use) { q_badwords = db_mysql_quote(ci->badwords[i].word); - 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 (mysql_affected_rows(mysql) == 0) { - 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); + 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); @@ -714,15 +733,17 @@ void db_mysql_save_cs_info(ChannelInfo * ci) } /* TTB's */ - for (i = 0; i < TTB_SIZE; i++) { - 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 (mysql_affected_rows(mysql) == 0) { - 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]); + 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]); } } @@ -742,6 +763,8 @@ void db_mysql_save_cs_info(ChannelInfo * ci) free(q_botnick); free(q_forbidby); free(q_forbidreason); + + return ret; } /*************************************************************************/ @@ -754,6 +777,7 @@ void db_mysql_save_cs_info(ChannelInfo * ci) /*************************************************************************/ /* 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 @@ -763,9 +787,10 @@ void db_mysql_save_cs_info(ChannelInfo * ci) * - anope_os_core */ -void db_mysql_save_os_db(unsigned int maxucnt, unsigned int maxutime, +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; @@ -777,31 +802,32 @@ void db_mysql_save_os_db(unsigned int maxucnt, unsigned int maxutime, /* First save the core info */ - 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); + 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; i < ak->count; i++) { + for (i = 0; ret && (i < ak->count); i++) { akl = 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); - 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 (mysql_affected_rows(mysql) == 0) { - 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); + 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); @@ -811,22 +837,24 @@ void db_mysql_save_os_db(unsigned int maxucnt, unsigned int maxutime, } /* Time to save the SGLINEs */ - for (i = 0; i < sgl->count; i++) { + for (i = 0; ret && (i < sgl->count); i++) { sl = sgl->list[i]; q_mask = db_mysql_quote(sl->mask); q_by = db_mysql_quote(sl->by); q_reason = db_mysql_quote(sl->reason); - 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 (mysql_affected_rows(mysql) == 0) { - 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); + 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); @@ -835,23 +863,25 @@ void db_mysql_save_os_db(unsigned int maxucnt, unsigned int maxutime, } /* Save the SQLINEs */ - for (i = 0; i < sql->count; i++) { + for (i = 0; ret && (i < sql->count); i++) { sl = sql->list[i]; q_mask = db_mysql_quote(sl->mask); q_by = db_mysql_quote(sl->by); q_reason = db_mysql_quote(sl->reason); - 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 (mysql_affected_rows(mysql) == 0) { - 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); + 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); @@ -860,29 +890,33 @@ void db_mysql_save_os_db(unsigned int maxucnt, unsigned int maxutime, } /* Now save the SZLINEs */ - for (i = 0; i < szl->count; i++) { + for (i = 0; ret && (i < szl->count); i++) { sl = szl->list[i]; q_mask = db_mysql_quote(sl->mask); q_by = db_mysql_quote(sl->by); q_reason = db_mysql_quote(sl->reason); - 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 (mysql_affected_rows(mysql) == 0) { - 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); + 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; } /*************************************************************************/ @@ -891,26 +925,31 @@ void db_mysql_save_os_db(unsigned int maxucnt, unsigned int maxutime, * These tables are tagged and will be cleaned: * - anope_os_news */ -void db_mysql_save_news(NewsItem * ni) +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); - 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 (mysql_affected_rows(mysql) == 0) { - 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); + 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; } /*************************************************************************/ @@ -920,8 +959,9 @@ void db_mysql_save_news(NewsItem * ni) * - anope_os_exceptions */ -void db_mysql_save_exceptions(Exception * e) +int db_mysql_save_exceptions(Exception * e) { + int ret; char *q_mask; char *q_who; char *q_reason; @@ -930,22 +970,25 @@ void db_mysql_save_exceptions(Exception * e) q_who = db_mysql_quote(e->who); q_reason = db_mysql_quote(e->reason); - 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 (mysql_affected_rows(mysql) == 0) { - 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); + 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; } /*************************************************************************/ @@ -962,8 +1005,9 @@ void db_mysql_save_exceptions(Exception * e) * - anope_hs_core */ -void db_mysql_save_hs_core(HostCore * hc) +int db_mysql_save_hs_core(HostCore * hc) { + int ret; char *q_nick; char *q_ident; char *q_host; @@ -974,20 +1018,25 @@ void db_mysql_save_hs_core(HostCore * hc) q_host = db_mysql_quote(hc->vHost); q_creator = db_mysql_quote(hc->creator); - 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 (mysql_affected_rows(mysql) == 0) { - 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); + 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; } /*************************************************************************/ @@ -997,8 +1046,10 @@ void db_mysql_save_hs_core(HostCore * hc) */ /*************************************************************************/ -void db_mysql_save_bs_core(BotInfo * bi) + +int db_mysql_save_bs_core(BotInfo * bi) { + int ret; char *q_nick; char *q_user; char *q_host; @@ -1009,22 +1060,26 @@ void db_mysql_save_bs_core(BotInfo * bi) q_host = db_mysql_quote(bi->host); q_real = db_mysql_quote(bi->real); - 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 (mysql_affected_rows(mysql) == 0) { - 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)"); + 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; } /*************************************************************************/ @@ -1035,18 +1090,23 @@ void db_mysql_save_bs_core(BotInfo * bi) /*************************************************************************/ /*************************************************************************/ -void db_mysql_load_bs_dbase(void) +int db_mysql_load_bs_dbase(void) { + int ret; BotInfo *bi; if (!do_mysql) - return; - - db_mysql_try - ("SELECT nick, user, host, rname, flags, created FROM anope_bs_core WHERE active = 1"); + 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 = makebot(mysql_row[0]); bi->user = sstrdup(mysql_row[1]); @@ -1058,18 +1118,25 @@ void db_mysql_load_bs_dbase(void) } mysql_free_result(mysql_res); + + return 1; } -void db_mysql_load_hs_dbase(void) +int db_mysql_load_hs_dbase(void) { + int ret; int32 time; if (!do_mysql) - return; + return 0; - db_mysql_try - ("SELECT nick, vident, vhost, creator, `time` FROM anope_hs_core WHERE active = 1"); + 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))) { @@ -1079,18 +1146,25 @@ void db_mysql_load_hs_dbase(void) } mysql_free_result(mysql_res); + + return 1; } -void db_mysql_load_news(void) +int db_mysql_load_news(void) { + int ret; int i; if (!do_mysql) - return; + return 0; - db_mysql_try - ("SELECT type, num, ntext, who, `time` FROM anope_os_news WHERE active = 1"); + 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); @@ -1114,18 +1188,25 @@ void db_mysql_load_news(void) } mysql_free_result(mysql_res); + + return 1; } -void db_mysql_load_exceptions(void) +int db_mysql_load_exceptions(void) { + int ret; int i; if (!do_mysql) - return; + return 0; - db_mysql_try - ("SELECT mask, lim, who, reason, `time`, expires FROM anope_os_exceptions WHERE active = 1"); + 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 = scalloc(nexceptions, sizeof(Exception)); @@ -1142,21 +1223,26 @@ void db_mysql_load_exceptions(void) } mysql_free_result(mysql_res); + + return 1; } -void db_mysql_load_os_dbase(void) +int db_mysql_load_os_dbase(void) { + int ret; Akill *ak; SXLine *sl; int akc, sglc, sqlc, szlc; if (!do_mysql) - return; - - db_mysql_try - ("SELECT maxusercnt, maxusertime, akills_count, sglines_count, " - "sqlines_count, szlines_count FROM anope_os_core"); + 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))) { @@ -1186,9 +1272,13 @@ void db_mysql_load_os_dbase(void) /* Load the AKILLs */ - db_mysql_try - ("SELECT user, host, xby, reason, seton, expire FROM anope_os_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); @@ -1208,9 +1298,13 @@ void db_mysql_load_os_dbase(void) /* Load the SGLINEs */ - db_mysql_try - ("SELECT mask, xby, reason, seton, expire FROM anope_os_sglines WHERE active = 1"); + 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); @@ -1229,8 +1323,12 @@ void db_mysql_load_os_dbase(void) /* Load the SQLINEs */ - db_mysql_try - ("SELECT mask, xby, reason, seton, expire FROM anope_os_sqlines WHERE active = 1"); + 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); @@ -1250,9 +1348,13 @@ void db_mysql_load_os_dbase(void) /* Load the SZLINEs */ - db_mysql_try - ("SELECT mask, xby, reason, seton, expire FROM anope_os_szlines WHERE active = 1"); + 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); @@ -1267,10 +1369,13 @@ void db_mysql_load_os_dbase(void) } mysql_free_result(mysql_res); + + return 1; } -void db_mysql_load_cs_dbase(void) +int db_mysql_load_cs_dbase(void) { + int ret; char *q_name; ChannelInfo *ci; int i; @@ -1278,22 +1383,24 @@ void db_mysql_load_cs_dbase(void) MYSQL_ROW row; if (!do_mysql) - return; + return 0; - 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"); + 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 ((mysql_row = mysql_fetch_row(mysql_res))) { + while (ret && (mysql_row = mysql_fetch_row(mysql_res))) { ci = scalloc(1, sizeof(ChannelInfo)); /* Name, founder, successor, password */ @@ -1357,137 +1464,161 @@ void db_mysql_load_cs_dbase(void) q_name = db_mysql_quote(ci->name); /* Get the LEVELS list */ - db_mysql_try("SELECT position, level FROM anope_cs_levels WHERE " - "channel = '%s' AND active = 1", q_name); + ret = db_mysql_try("SELECT position, level " + "FROM anope_cs_levels " + "WHERE channel = '%s' AND active = 1", + q_name); - res = mysql_use_result(mysql); - ci->levels = scalloc(CA_SIZE, sizeof(*ci->levels)); - reset_levels(ci); + if (ret) { + res = mysql_use_result(mysql); + ci->levels = 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); - } + 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); + mysql_free_result(res); + } /* Get the channel ACCESS list */ - if (ci->accesscount > 0) { + if (ret && (ci->accesscount > 0)) { ci->access = scalloc(ci->accesscount, sizeof(ChanAccess)); - db_mysql_try - ("SELECT level, display, last_seen FROM anope_cs_access " - "WHERE channel = '%s' AND in_use = 1 AND active = 1", - q_name); - - 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++; + 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 (ci->akickcount > 0) { + if (ret && (ci->akickcount > 0)) { ci->akick = scalloc(ci->akickcount, sizeof(AutoKick)); - 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); - - 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]); + 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++; } - 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); + mysql_free_result(res); + } } - /* Get the channel memos */ - 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); - - res = mysql_store_result(mysql); - ci->memos.memocount = mysql_num_rows(res); - - if (ci->memos.memocount > 0) { - Memo *memos; - - memos = 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++; + 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 = 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); } } - mysql_free_result(res); - /* Get the TTB data */ - ci->ttb = scalloc(TTB_SIZE, sizeof(*ci->ttb)); - - db_mysql_try("SELECT ttb_id, value FROM anope_cs_ttb WHERE " - "channel = '%s' AND active = 1", q_name); - - res = mysql_use_result(mysql); + if (ret) { + ci->ttb = 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); + } - 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); + } } - mysql_free_result(res); - /* Get the badwords */ - if (ci->bwcount > 0) { + if (ret && (ci->bwcount > 0)) { ci->badwords = scalloc(ci->bwcount, sizeof(BadWord)); - db_mysql_try("SELECT word, type FROM anope_cs_badwords WHERE " - "channel = '%s' AND active = 1", q_name); + ret = db_mysql_try("SELECT word, type " + "FROM anope_cs_badwords " + "WHERE channel = '%s' AND active = 1", + q_name); - res = mysql_use_result(mysql); + 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++; - } + 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); + mysql_free_result(res); + } } /* YAY! all done; free q_name and insert the channel */ @@ -1514,37 +1645,46 @@ void db_mysql_load_cs_dbase(void) } } } + + return ret; } -void db_mysql_load_ns_req_dbase(void) +int db_mysql_load_ns_req_dbase(void) { + int ret; NickRequest *nr; if (!do_mysql) - return; + return 0; - db_mysql_try("SELECT nick, passcode, password, email, requested FROM " - "anope_ns_request WHERE active = 1"); + ret = db_mysql_try("SELECT nick, passcode, password, email, requested " + "FROM anope_ns_request " + "WHERE active = 1"); - mysql_res = mysql_use_result(mysql); + if (ret) { + mysql_res = mysql_use_result(mysql); - while ((mysql_row = mysql_fetch_row(mysql_res))) { - nr = scalloc(1, sizeof(NickRequest)); + while ((mysql_row = mysql_fetch_row(mysql_res))) { + nr = scalloc(1, sizeof(NickRequest)); - nr->nick = sstrdup(mysql_row[0]); - nr->passcode = sstrdup(mysql_row[1]); - nr->password = sstrdup(mysql_row[2]); - nr->email = sstrdup(mysql_row[3]); - nr->requested = strtol(mysql_row[4], (char **) NULL, 10); + nr->nick = sstrdup(mysql_row[0]); + nr->passcode = sstrdup(mysql_row[1]); + nr->password = sstrdup(mysql_row[2]); + nr->email = sstrdup(mysql_row[3]); + nr->requested = strtol(mysql_row[4], (char **) NULL, 10); - insert_requestnick(nr); - } + insert_requestnick(nr); + } - mysql_free_result(mysql_res); + mysql_free_result(mysql_res); + } + + return ret; } -void db_mysql_load_ns_dbase(void) +int db_mysql_load_ns_dbase(void) { + int ret; char *q_display; NickCore *nc; NickAlias *na; @@ -1553,18 +1693,21 @@ void db_mysql_load_ns_dbase(void) int i; if (!do_mysql) - return; + return 0; - db_mysql_try("SELECT display, pass, email, icq, url, flags, language, " - "accesscount, memocount, memomax, channelcount, channelmax, " - "greet FROM anope_ns_core WHERE active = 1"); + ret = db_mysql_try("SELECT display, pass, email, icq, url, flags, language, accesscount, memocount, memomax, channelcount, channelmax, 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 ((mysql_row = mysql_fetch_row(mysql_res))) { + while (ret && (mysql_row = mysql_fetch_row(mysql_res))) { nc = scalloc(1, sizeof(NickCore)); /* Display, password, email, ICQ, URL, flags */ @@ -1604,52 +1747,56 @@ void db_mysql_load_ns_dbase(void) q_display = db_mysql_quote(nc->display); /* Fill the accesslist */ - if (nc->accesscount > 0) { + if (ret && (nc->accesscount > 0)) { nc->access = scalloc(nc->accesscount, sizeof(char *)); - db_mysql_try("SELECT access FROM anope_ns_access WHERE " - "display = '%s' AND active = 1", q_display); + ret = db_mysql_try("SELECT access " + "FROM anope_ns_access " + "WHERE display = '%s' AND active = 1", + q_display); - res = mysql_use_result(mysql); + 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++; + i = 0; + while ((row = mysql_fetch_row(res))) { + if (row[0] && *(row[0])) { + nc->access[i] = sstrdup(row[0]); + i++; + } } - } - mysql_free_result(res); + mysql_free_result(res); + } } /* Load the memos */ - if (nc->memos.memocount > 0) { + if (ret && (nc->memos.memocount > 0)) { nc->memos.memos = scalloc(nc->memos.memocount, sizeof(Memo)); - 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); + 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); - res = mysql_use_result(mysql); + 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++; - } + 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]); - mysql_free_result(res); + i++; + } + + mysql_free_result(res); + } } /* Done with the core; insert it */ @@ -1658,13 +1805,17 @@ void db_mysql_load_ns_dbase(void) mysql_free_result(mysql_res); + if (!ret) + return 0; /* Load the nickaliases */ - db_mysql_try - ("SELECT nick, display, time_registered, last_seen, status, " - "last_usermask, last_realname, last_quit FROM anope_ns_alias " - "WHERE active = 1"); + 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))) { @@ -1708,6 +1859,8 @@ void db_mysql_load_ns_dbase(void) } mysql_free_result(mysql_res); + + return ret; } /* get random mysql number for the generator */ |