summaryrefslogtreecommitdiff
path: root/src/mysql.c
diff options
context:
space:
mode:
authorgeniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b <geniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2006-12-09 22:35:44 +0000
committergeniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b <geniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2006-12-09 22:35:44 +0000
commit6e4112460817c1a099f2143b5e5d18a23c1be621 (patch)
tree7ed50fbba3e2779228c1ddf2811f74ce98e79344 /src/mysql.c
parent888fe64c6001c09622162d873375dd638c20f85f (diff)
BUILD : 1.7.17 (1198) BUGS : NOTES : Reviewed and updated all of the MySQL code...
git-svn-id: svn://svn.anope.org/anope/trunk@1198 31f1291d-b8d6-0310-a050-a5561fc1590b git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@917 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src/mysql.c')
-rw-r--r--src/mysql.c2109
1 files changed, 1125 insertions, 984 deletions
diff --git a/src/mysql.c b/src/mysql.c
index a7f84b06e..19db1e419 100644
--- a/src/mysql.c
+++ b/src/mysql.c
@@ -22,10 +22,13 @@ 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? */
+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];
@@ -50,6 +53,7 @@ void db_mysql_error(int severity, char *msg)
/*************************************************************************/
+/* Initialize the MySQL code */
int db_mysql_init()
{
@@ -84,19 +88,25 @@ 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
+ * mysql connection (unless something unexpected happens ofcourse...)
+ */
int db_mysql_open()
{
/* If MySQL is disabled, return 0 */
if (!do_mysql)
return 0;
-
- /* If we're already connected, return 1 */
- if (mysql_is_connected)
- return 1;
-
+
+ /* If we're already connected, return 1 */
+ if (mysql_is_connected)
+ return 1;
+
mysql = mysql_init(NULL);
- if (mysql == NULL)
+ if (mysql == NULL) {
db_mysql_error(MYSQL_WARNING, "Unable to create mysql object");
+ return 0;
+ }
if (!MysqlPort)
MysqlPort = MYSQL_DEFAULT_PORT;
@@ -118,15 +128,19 @@ int db_mysql_open()
return 0;
}
}
-
- mysql_is_connected = 1;
-
+
+ mysql_is_connected = 1;
+
return 1;
}
/*************************************************************************/
+/* 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.
+ */
int db_mysql_query(char *sql)
{
int lcv;
@@ -137,14 +151,14 @@ int db_mysql_query(char *sql)
}
if (debug) {
- alog("debug: MySQL: %s", sql);
+ 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;
@@ -168,15 +182,17 @@ int db_mysql_query(char *sql)
/*************************************************************************/
+/* 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) {
+ if (!sql)
return sstrdup("");
- }
slen = strlen(sql);
quoted = malloc((1 + (slen * 2)) * sizeof(char));
@@ -188,49 +204,40 @@ char *db_mysql_quote(char *sql)
/*************************************************************************/
-/* I don't like using res here, maybe we can pass it as a param? */
+/* Close the MySQL database connection. */
int db_mysql_close()
{
- if (mysql_res)
- mysql_free_result(mysql_res);
mysql_close(mysql);
-
- mysql_is_connected = 0;
-
+
+ mysql_is_connected = 0;
+
return 1;
}
/*************************************************************************/
-/*
- * NickServ Specific Secion
- */
-
-/*************************************************************************/
-void db_mysql_save_ns_req(NickRequest * nr)
+/* Try to execute a query and issue a warning when failed */
+void db_mysql_try(const char *fmt, ...)
{
- char *qnick, *qpasscode, *qpassword, *qemail;
- char sqlcmd[MAX_SQL_BUF];
-
- qnick = db_mysql_quote(nr->nick);
- qpasscode = db_mysql_quote(nr->passcode);
- qpassword = db_mysql_quote(nr->password);
- qemail = db_mysql_quote(nr->email);
-
- snprintf(sqlcmd, MAX_SQL_BUF,
- "REPLACE anope_ns_request (nick,passcode,password,email,requested,active)"
- " VALUES ('%s','%s','%s','%s','%d','1')",
- qnick, qpasscode, qpassword, qemail, (int) nr->requested);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
+ 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_ERROR, "query");
}
- free(qnick);
- free(qpasscode);
- free(qpassword);
- free(qemail);
}
+/*************************************************************************/
+
+/* 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
+ */
char *db_mysql_secure(char *pass)
{
char epass[BUFSIZE];
@@ -238,12 +245,12 @@ char *db_mysql_secure(char *pass)
/* Initialize the buffer. Bug #86 */
memset(epass, '\0', BUFSIZE);
- memset(tmp_pass, 0, PASSMAX);
+ memset(tmp_pass, '\0', PASSMAX);
/* We couldnt decrypt the pass... */
- if(enc_decrypt(pass,tmp_pass,PASSMAX)!=1) {
+ if (enc_decrypt(pass, tmp_pass, PASSMAX) != 1) {
snprintf(epass, sizeof(epass), "'%s'", pass);
- } else { /* if we could decrypt the pass */
+ } else { /* if we could decrypt the pass */
if (!pass) {
snprintf(epass, sizeof(epass), "''");
} else if ((!MysqlSecure) || (strcmp(MysqlSecure, "") == 0)) {
@@ -257,138 +264,199 @@ char *db_mysql_secure(char *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
+ * These tables are tagged and will be cleaned:
+ * - anope_ns_request
+ */
+void db_mysql_save_ns_req(NickRequest * nr)
+{
+ 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);
+
+ 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);
+ }
+
+ free(q_nick);
+ free(q_passcode);
+ free(q_password);
+ free(q_email);
+}
+
+/*************************************************************************/
+
+/* Save the given NickCore into the database
+ * Also save the access list and memo's for this user
+ * 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)
{
- char sqlcmd[MAX_SQL_BUF];
- int j;
+ int i;
char **access;
Memo *memos;
- char *cnick, *cpass, *epass, *cemail, *cgreet, *curl, *caccess,
- *msender, *mtext;
+ char *q_display, *q_pass, *epass, *q_email, *q_greet, *q_url,
+ *q_access, *q_sender, *q_text;
- cnick = db_mysql_quote(nc->display);
- cpass = db_mysql_quote(nc->pass);
- cemail = db_mysql_quote(nc->email);
- cgreet = db_mysql_quote(nc->greet);
- curl = db_mysql_quote(nc->url);
+ 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(cpass);
- free(cpass);
+ epass = db_mysql_secure(q_pass);
+ free(q_pass);
/* Let's take care of the core itself */
/* Update the existing records */
- snprintf(sqlcmd, MAX_SQL_BUF,
- "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, cemail, cgreet, nc->icq, curl, nc->flags,
- nc->language, nc->accesscount, nc->memos.memocount,
- nc->memos.memomax, nc->channelcount, nc->channelmax, cnick);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- }
+ 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);
- /* need to write a wrapper for mysql_affected_rows */
/* Our previous UPDATE affected no rows, therefore this is a new record */
- if ((int) mysql_affected_rows(mysql) <= 0) {
-
- /* Let's take care of the core itself */
- snprintf(sqlcmd, MAX_SQL_BUF,
- "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')",
- cnick, epass, cemail, cgreet, nc->icq, curl, nc->flags,
- nc->language, nc->accesscount, nc->memos.memocount,
- nc->memos.memomax, nc->channelcount, nc->channelmax);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- }
+ 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);
}
/* Now let's do the access */
- for (j = 0, access = nc->access; j < nc->accesscount; j++, access++) {
- caccess = db_mysql_quote(*access);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "INSERT DELAYED INTO anope_ns_access (display,access) VALUES ('%s','%s')",
- cnick, caccess);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
+ for (i = 0; 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);
+
+ if (mysql_affected_rows(mysql) == 0) {
+ db_mysql_try
+ ("INSERT DELAYED INTO anope_ns_access (display, access) "
+ "VALUES ('%s','%s')", q_display, q_access);
}
- free(caccess);
+
+ free(q_access);
}
- /* And... memos */
- memos = nc->memos.memos;
- for (j = 0; j < nc->memos.memocount; j++, memos++) {
- msender = db_mysql_quote(memos->sender);
- mtext = db_mysql_quote(memos->text);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "INSERT DELAYED INTO anope_ms_info (receiver,number,flags,time,sender,text,serv)"
- " VALUES ('%s','%d','%d','%d','%s','%s','NICK')",
- cnick, memos->number, memos->flags,
- (int) memos->time, msender, mtext);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
+ /* Memos */
+ for (i = 0; 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);
+
+ /* 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);
}
- free(msender);
- free(mtext);
+
+ free(q_sender);
+ free(q_text);
}
- free(cnick);
+ free(q_display);
free(epass);
- free(cemail);
- free(cgreet);
- free(curl);
+ free(q_email);
+ free(q_greet);
+ free(q_url);
}
/*************************************************************************/
+
+/* Save the given NickAlias into the database
+ * 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)
{
- char sqlcmd[MAX_SQL_BUF];
- char *nnick, *nlmask, *nlrname, *nlquit, *nncnick;
- nnick = db_mysql_quote(na->nick);
- nlmask = db_mysql_quote(na->last_usermask);
- nlrname = db_mysql_quote(na->last_realname);
- nlquit = db_mysql_quote(na->last_quit);
- nncnick = db_mysql_quote(na->nc->display);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "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'",
- nlmask, nlrname, nlquit, (int) na->time_registered,
- (int) na->last_seen, (int) na->status, nncnick, nnick);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- }
- /* Our previous UPDATE affected no rows, therefore this is a new record */
- if ((int) mysql_affected_rows(mysql) <= 0) {
- snprintf(sqlcmd, MAX_SQL_BUF,
- "INSERT 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')",
- nnick, nlmask, nlrname, nlquit, (int) na->time_registered,
- (int) na->last_seen, (int) na->status, nncnick);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- }
- }
+ 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);
- free(nnick);
- free(nlmask);
- free(nlrname);
- free(nlquit);
- free(nncnick);
+ 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);
- return;
+ /* 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);
+ }
+
+ free(q_nick);
+ free(q_lastmask);
+ free(q_lastrname);
+ free(q_lastquit);
+ free(q_display);
}
/*************************************************************************/
@@ -398,247 +466,282 @@ 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
+ * 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')
+ */
void db_mysql_save_cs_info(ChannelInfo * ci)
{
- char sqlcmd[MAX_SQL_BUF];
- int j, position;
+ int i;
Memo *memos;
- char *ciname, *cifoundernick, *cisuccessornick, *cifounderpass,
- *cidesc, *ciurl, *ciemail, *cilasttopic, *cilasttopicsetter,
- *ciforbidby, *ciforbidreason, *cimlock_key, *cimlock_flood,
- *cimlock_redirect, *cientrymsg, *cibotnick, *msender, *mtext,
- *ciaccessdisp, *ciakickdisp, *ciakickreason, *ciakickcreator,
- *cbadwords, *efounderpass;
-
- ciname = db_mysql_quote(ci->name);
+ 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) {
- cifoundernick = db_mysql_quote(ci->founder->display);
+ q_founder = db_mysql_quote(ci->founder->display);
} else {
- cifoundernick = db_mysql_quote("");
+ q_founder = db_mysql_quote("");
}
if (ci->successor) {
- cisuccessornick = db_mysql_quote(ci->successor->display);
+ q_successor = db_mysql_quote(ci->successor->display);
} else {
- cisuccessornick = db_mysql_quote("");
- }
- cifounderpass = db_mysql_quote(ci->founderpass);
- cidesc = db_mysql_quote(ci->desc);
- ciurl = db_mysql_quote(ci->url);
- ciemail = db_mysql_quote(ci->email);
- cilasttopic = db_mysql_quote(ci->last_topic);
- cilasttopicsetter = db_mysql_quote(ci->last_topic_setter);
- ciforbidby = db_mysql_quote(ci->forbidby);
- ciforbidreason = db_mysql_quote(ci->forbidreason);
- cimlock_key = db_mysql_quote(ci->mlock_key);
- cimlock_flood = db_mysql_quote(ci->mlock_flood);
- cimlock_redirect = db_mysql_quote(ci->mlock_redirect);
- cientrymsg = db_mysql_quote(ci->entry_message);
+ 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) {
- cibotnick = db_mysql_quote(ci->bi->nick);
+ q_botnick = db_mysql_quote(ci->bi->nick);
} else {
- cibotnick = db_mysql_quote("");
+ q_botnick = db_mysql_quote("");
}
- efounderpass = db_mysql_secure(cifounderpass);
- free(cifounderpass);
+ e_pass = db_mysql_secure(q_pass);
+ free(q_pass);
/* Let's take care of the core itself */
- snprintf(sqlcmd, MAX_SQL_BUF,
- "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'",
- cifoundernick,
- cisuccessornick,
- efounderpass, cidesc, ciurl, ciemail,
- (int) ci->time_registered, (int) ci->last_used,
- cilasttopic, cilasttopicsetter,
- (int) ci->last_topic_time, (int) ci->flags,
- ciforbidby, ciforbidreason, (int) ci->bantype,
- (int) ci->accesscount, (int) ci->akickcount,
- (int) ci->mlock_on, (int) ci->mlock_off,
- (int) ci->mlock_limit, cimlock_key,
- cimlock_flood,
- cimlock_redirect,
- cientrymsg,
- (int) ci->memos.memomax,
- cibotnick,
- (int) ci->botflags,
- (int) ci->bwcount,
- (int) ci->capsmin,
- (int) ci->capspercent,
- (int) ci->floodlines,
- (int) ci->floodsecs, (int) ci->repeattimes, ciname);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- }
+ 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 ((int) mysql_affected_rows(mysql) <= 0) {
- snprintf(sqlcmd, MAX_SQL_BUF,
- "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')",
- ciname,
- cifoundernick,
- cisuccessornick,
- efounderpass, cidesc, ciurl, ciemail,
- (int) ci->time_registered, (int) ci->last_used,
- cilasttopic, cilasttopicsetter,
- (int) ci->last_topic_time, (int) ci->flags,
- ciforbidby, ciforbidreason, (int) ci->bantype,
- (int) ci->accesscount, (int) ci->akickcount,
- (int) ci->mlock_on, (int) ci->mlock_off,
- (int) ci->mlock_limit, cimlock_key,
- cimlock_flood,
- cimlock_redirect,
- cientrymsg,
- cibotnick,
- (int) ci->botflags,
- (int) ci->bwcount,
- (int) ci->capsmin,
- (int) ci->capspercent,
- (int) ci->floodlines,
- (int) ci->floodsecs, (int) ci->repeattimes);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- }
+ 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);
}
/* Memos */
- memos = ci->memos.memos;
- for (j = 0; j < ci->memos.memocount; j++, memos++) {
- msender = db_mysql_quote(memos->sender);
- mtext = db_mysql_quote(memos->text);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "INSERT DELAYED INTO anope_ms_info (receiver,number,flags,time,sender,text,serv)"
- " VALUES ('%s','%d','%d','%d','%s','%s','CHAN')",
- ciname, memos->number, memos->flags,
- (int) memos->time, msender, mtext);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
+ for (i = 0; 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);
+
+ /* See comment at db_mysql_save_ns_core */
+ ci->memos.memos[i].id = mysql_insert_id(mysql);
}
- free(msender);
- free(mtext);
+
+ free(q_sender);
+ free(q_text);
}
/* Access */
- for (j = 0; j < ci->accesscount; j++) {
- if (ci->access[j].in_use) {
- ciaccessdisp = db_mysql_quote(ci->access[j].nc->display);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "INSERT DELAYED INTO anope_cs_access (in_use,level,display,channel,last_seen)"
- " VALUES ('%d','%d','%s','%s','%d')",
- (int) ci->access[j].in_use, (int) ci->access[j].level,
- ciaccessdisp, ciname, (int) ci->access[j].last_seen);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
+ for (i = 0; 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);
}
- free(ciaccessdisp);
+ free(q_accessdisp);
}
}
/* Levels */
- position = 0;
- for (j = 0; j < CA_SIZE; j++) {
- snprintf(sqlcmd, MAX_SQL_BUF,
- "INSERT DELAYED INTO anope_cs_levels (channel, position, level) VALUES ('%s','%d','%d')",
- ciname, position++, (int) ci->levels[j]);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
+ 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]);
}
}
/* Akicks */
- for (j = 0; j < ci->akickcount; j++) {
- ciakickdisp =
- ci->akick[j].flags & AK_USED ? ci->akick[j].
- flags & AK_ISNICK ? db_mysql_quote(ci->akick[j].u.nc->
- display) :
- db_mysql_quote(ci->akick[j].u.mask) : "";
- ciakickreason =
- ci->akick[j].flags & AK_USED ? db_mysql_quote(ci->akick[j].
- reason) : "";
- ciakickcreator =
- ci->akick[j].flags & AK_USED ? db_mysql_quote(ci->akick[j].
- creator) : "";
- snprintf(sqlcmd, MAX_SQL_BUF,
- "INSERT DELAYED INTO anope_cs_akicks (channel, flags, dmask, reason, creator,"
- " addtime) VALUES ('%s','%d','%s','%s','%s','%d')",
- ciname, (int) ci->akick[j].flags, ciakickdisp,
- ciakickreason, ciakickcreator,
- ci->akick[j].flags & AK_USED ? (int) ci->akick[j].
- addtime : 0);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
+ for (i = 0; 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 = "";
}
- if (ci->akick[j].flags & AK_USED) {
- free(ciakickdisp);
- free(ciakickreason);
- free(ciakickcreator);
+
+ 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));
+ }
+
+ if (ci->akick[i].flags & AK_USED) {
+ free(q_akickdisp);
+ free(q_akickreason);
+ free(q_akickcreator);
}
}
/* Bad Words */
- for (j = 0; j < ci->bwcount; j++) {
- if (ci->badwords[j].in_use) {
- cbadwords = db_mysql_quote(ci->badwords[j].word);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "INSERT DELAYED INTO anope_cs_badwords (channel, word, type)"
- " VALUES ('%s','%s','%d')", ciname, cbadwords,
- (int) ci->badwords[j].type);
- free(cbadwords);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
+ for (i = 0; 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);
}
+
+ free(q_badwords);
}
}
/* TTB's */
- for (j = 0; j < TTB_SIZE; j++) {
- snprintf(sqlcmd, MAX_SQL_BUF, "INSERT DELAYED INTO anope_cs_ttb (channel, ttb_id, value)"
- " VALUES ('%s', %d, %d)", ciname, j, ci->ttb[j]);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
+ 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]);
}
}
- free(ciname);
- free(cifoundernick); /* mark */
- free(cisuccessornick); /* mark */
- free(efounderpass);
- free(cidesc);
- free(ciurl);
- free(ciemail);
- free(cilasttopic);
- free(cilasttopicsetter);
- free(cimlock_key);
- free(cimlock_flood);
- free(cimlock_redirect);
- free(cientrymsg);
- free(cibotnick); /* mark */
- free(ciforbidby);
- free(ciforbidreason);
-
- return;
+ 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);
}
/*************************************************************************/
@@ -649,167 +752,200 @@ void db_mysql_save_cs_info(ChannelInfo * ci)
*/
/*************************************************************************/
+
+/* Save the OperServ database into MySQL
+ * 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
+ */
+
void db_mysql_save_os_db(unsigned int maxucnt, unsigned int maxutime,
SList * ak, SList * sgl, SList * sql, SList * szl)
{
- char sqlcmd[MAX_SQL_BUF];
- Akill *t_ak;
- SXLine *t_sl;
- char *takuser, *takhost, *takby, *takreason, *tslmask, *tslby,
- *tslreason;
-
- int i, j;
-
- rdb_clear_table("anope_os_core");
-
- snprintf(sqlcmd, MAX_SQL_BUF,
- "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);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- }
-
- /* now the akills saving */
- rdb_clear_table("anope_os_akills");
-
- j = ak->count;
- for (i = 0; i < j; i++) {
- t_ak = ak->list[i];
- takuser = db_mysql_quote(t_ak->user);
- takhost = db_mysql_quote(t_ak->host);
- takby = db_mysql_quote(t_ak->by);
- takreason = db_mysql_quote(t_ak->reason);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "INSERT DELAYED INTO anope_os_akills (user,host,xby,reason,seton,expire) VALUES ('%s','%s','%s','%s','%d','%d')",
- takuser,
- takhost,
- takby, takreason, (int) t_ak->seton, (int) t_ak->expires);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
+ 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 */
+ 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++) {
+ 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);
}
- free(takuser);
- free(takhost);
- free(takby);
- free(takreason);
- }
-/* sglines save */
- rdb_clear_table("anope_os_sglines");
-
- j = sgl->count;
- for (i = 0; i < j; i++) {
- t_sl = sgl->list[i];
- tslmask = db_mysql_quote(t_sl->mask);
- tslby = db_mysql_quote(t_sl->by);
- tslreason = db_mysql_quote(t_sl->reason);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "INSERT DELAYED INTO anope_os_sglines (mask,xby,reason,seton,expire) VALUES"
- " ('%s','%s','%s','%d','%d')",
- tslmask,
- tslby, tslreason, (int) t_sl->seton, (int) t_sl->expires);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
+ free(q_user);
+ free(q_host);
+ free(q_by);
+ free(q_reason);
+ }
+
+ /* Time to save the SGLINEs */
+ for (i = 0; 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);
}
- free(tslmask);
- free(tslby);
- free(tslreason);
- }
-/* sqlines save */
- rdb_clear_table("anope_os_sqlines");
-
- j = sql->count;
- for (i = 0; i < j; i++) {
- t_sl = sql->list[i];
- tslmask = db_mysql_quote(t_sl->mask);
- tslby = db_mysql_quote(t_sl->by);
- tslreason = db_mysql_quote(t_sl->reason);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "INSERT DELAYED INTO anope_os_sqlines (mask,xby,reason,seton,expire) VALUES ('%s','%s','%s','%d','%d')",
- tslmask,
- tslby, tslreason, (int) t_sl->seton, (int) t_sl->expires);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
+ free(q_mask);
+ free(q_by);
+ free(q_reason);
+ }
+
+ /* Save the SQLINEs */
+ for (i = 0; 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);
}
- free(tslmask);
- free(tslby);
- free(tslreason);
- }
-/* szlines save */
- rdb_clear_table("anope_os_szlines");
-
- j = szl->count;
- for (i = 0; i < j; i++) {
- t_sl = szl->list[i];
- tslmask = db_mysql_quote(t_sl->mask);
- tslby = db_mysql_quote(t_sl->by);
- tslreason = db_mysql_quote(t_sl->reason);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "INSERT DELAYED INTO anope_os_szlines (mask,xby,reason,seton,expire) VALUES"
- " ('%s','%s','%s','%d','%d')",
- tslmask,
- tslby, tslreason, (int) t_sl->seton, (int) t_sl->expires);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
+ free(q_mask);
+ free(q_by);
+ free(q_reason);
+ }
+
+ /* Now save the SZLINEs */
+ for (i = 0; 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);
}
- free(tslmask);
- free(tslby);
- free(tslreason);
- }
- return;
+ free(q_mask);
+ free(q_by);
+ free(q_reason);
+ }
}
/*************************************************************************/
+
+/* Save the given NewsItem
+ * These tables are tagged and will be cleaned:
+ * - anope_os_news
+ */
void db_mysql_save_news(NewsItem * ni)
{
- char sqlcmd[MAX_SQL_BUF];
- char *nitext, *niwho;
- nitext = db_mysql_quote(ni->text);
- niwho = db_mysql_quote(ni->who);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "INSERT DELAYED INTO anope_os_news (type,num,ntext,who,`time`)"
- " VALUES ('%d','%d','%s','%s','%d')",
- ni->type, ni->num, nitext, niwho, (int) ni->time);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
+ 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);
}
- free(nitext);
- free(niwho);
- return;
+ free(q_text);
+ free(q_who);
}
/*************************************************************************/
+
+/* Save the given Exception
+ * These tables are tagged and will be cleaned:
+ * - anope_os_exceptions
+ */
+
void db_mysql_save_exceptions(Exception * e)
{
- char sqlcmd[MAX_SQL_BUF];
- char *emask, *ewho, *ereason;
- emask = db_mysql_quote(e->mask);
- ewho = db_mysql_quote(e->who);
- ereason = db_mysql_quote(e->reason);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "INSERT DELAYED INTO anope_os_exceptions (mask,lim,who,reason,`time`,expires)"
- " VALUES ('%s','%d','%s','%s','%d','%d')",
- emask, e->limit, ewho,
- ereason, (int) e->time, (int) e->expires);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- }
- free(emask);
- free(ewho);
- free(ereason);
- return;
+ 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);
+
+ 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);
+ }
+
+ free(q_mask);
+ free(q_who);
+ free(q_reason);
}
/*************************************************************************/
@@ -820,551 +956,556 @@ void db_mysql_save_exceptions(Exception * e)
*/
/*************************************************************************/
-/* TODO: Add vident to tables! */
+
+/* Save the given HostCore
+ * These tables are tagged and will be cleaned:
+ * - anope_hs_core
+ */
+
void db_mysql_save_hs_core(HostCore * hc)
{
- char sqlcmd[MAX_SQL_BUF];
- char *hcnick, *hcvident, *hcvhost, *hccreator;
- hcnick = db_mysql_quote(hc->nick);
- hcvident = db_mysql_quote(hc->vIdent);
- hcvhost = db_mysql_quote(hc->vHost);
- hccreator = db_mysql_quote(hc->creator);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "INSERT DELAYED INTO anope_hs_core (nick,vident,vhost,creator,`time`)"
- " VALUES ('%s','%s','%s','%s','%d')",
- hcnick, hcvident, hcvhost, hccreator, (int) hc->time);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- }
- free(hcnick);
- free(hcvident);
- free(hcvhost);
- free(hccreator);
-
- return;
+ 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);
+
+ 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);
+ }
+
+ free(q_nick);
+ free(q_ident);
+ free(q_host);
+ free(q_creator);
}
/*************************************************************************/
/*
- * HostServ Specific Section
+ * BotServ Specific Section
*/
/*************************************************************************/
void db_mysql_save_bs_core(BotInfo * bi)
{
- char sqlcmd[MAX_SQL_BUF];
- char *binick, *biuser, *bihost, *bireal;
- binick = db_mysql_quote(bi->nick);
- biuser = db_mysql_quote(bi->user);
- bihost = db_mysql_quote(bi->host);
- bireal = db_mysql_quote(bi->real);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "INSERT DELAYED INTO anope_bs_core (nick,user,host,rname,flags,created"
- ",chancount) VALUES ('%s','%s','%s','%s','%d','%d','%d')",
- binick, biuser,
- bihost, bireal, bi->flags, (int) bi->created, bi->chancount);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- }
- free(binick);
- free(biuser);
- free(bihost);
- free(bireal);
+ 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);
+
+ 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)");
+ }
+
+ free(q_nick);
+ free(q_user);
+ free(q_host);
+ free(q_real);
}
/*************************************************************************/
+/*************************************************************************/
+
+/* Some loading code! */
+
+/*************************************************************************/
+/*************************************************************************/
void db_mysql_load_bs_dbase(void)
{
BotInfo *bi;
- char sqlcmd[MAX_SQL_BUF];
if (!do_mysql)
return;
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `nick`,`user`,`host`,`rname`,`flags`,`created`,`chancount` FROM `anope_bs_core`");
+ db_mysql_try
+ ("SELECT nick, user, host, rname, flags, created FROM anope_bs_core WHERE active = 1");
+
+ mysql_res = mysql_use_result(mysql);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- return;
- }
- mysql_res = mysql_store_result(mysql);
- if (mysql_num_rows(mysql_res) == 0) {
- mysql_free_result(mysql_res);
- return;
- }
while ((mysql_row = mysql_fetch_row(mysql_res))) {
bi = makebot(mysql_row[0]);
bi->user = sstrdup(mysql_row[1]);
bi->host = sstrdup(mysql_row[2]);
bi->real = sstrdup(mysql_row[3]);
- bi->flags = atoi(mysql_row[4]);
- bi->created = atoi(mysql_row[5]);
- bi->chancount = atoi(mysql_row[6]);
+ 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);
}
void db_mysql_load_hs_dbase(void)
{
- char sqlcmd[MAX_SQL_BUF];
- char *nick;
- char *vHost;
- char *creator;
- char *vIdent;
int32 time;
if (!do_mysql)
return;
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `nick`,`vident`,`vhost`,`creator`,`time` FROM `anope_hs_core`");
+ db_mysql_try
+ ("SELECT nick, vident, vhost, creator, `time` FROM anope_hs_core WHERE active = 1");
+
+ mysql_res = mysql_use_result(mysql);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- return;
- }
- mysql_res = mysql_store_result(mysql);
- if (mysql_num_rows(mysql_res) == 0) {
- mysql_free_result(mysql_res);
- return;
- }
while ((mysql_row = mysql_fetch_row(mysql_res))) {
- nick = sstrdup(mysql_row[0]);
- vIdent = sstrdup(mysql_row[1]);
- vHost = sstrdup(mysql_row[2]);
- creator = sstrdup(mysql_row[3]);
- time = atoi(mysql_row[4]);
- addHostCore(nick, vIdent, vHost, creator, time);
- free(nick);
- free(vHost);
- free(creator);
- free(vIdent);
+ 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);
}
void db_mysql_load_news(void)
{
- char sqlcmd[MAX_SQL_BUF];
- int j;
+ int i;
if (!do_mysql)
return;
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `type`,`num`,`ntext`,`who`,`time` FROM `anope_os_news`");
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- return;
- }
+ db_mysql_try
+ ("SELECT type, num, ntext, who, `time` FROM anope_os_news WHERE active = 1");
+
mysql_res = mysql_store_result(mysql);
+
nnews = mysql_num_rows(mysql_res);
- if (nnews < 8)
- news_size = 16;
- else if (nnews >= 16384)
- news_size = 32767;
+ 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 = scalloc(sizeof(*news) * news_size, 1);
- if (!nnews) {
- mysql_free_result(mysql_res);
- return;
- }
- j = 0;
+
+ news = scalloc(news_size, sizeof(*news));
+
+ i = 0;
while ((mysql_row = mysql_fetch_row(mysql_res))) {
- news[j].type = atoi(mysql_row[0]);
- news[j].num = atoi(mysql_row[1]);
- news[j].text = sstrdup(mysql_row[2]);
- snprintf(news[j].who, NICKMAX, "%s", mysql_row[3]);
- news[j].time = atoi(mysql_row[4]);
- j++;
+ 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);
}
void db_mysql_load_exceptions(void)
{
- char sqlcmd[MAX_SQL_BUF];
- int j;
+ int i;
if (!do_mysql)
return;
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `mask`,`lim`,`who`,`reason`,`time`,`expires` FROM `anope_os_exceptions`;");
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- return;
- }
+ db_mysql_try
+ ("SELECT mask, lim, who, reason, `time`, expires FROM anope_os_exceptions WHERE active = 1");
+
mysql_res = mysql_store_result(mysql);
nexceptions = mysql_num_rows(mysql_res);
- exceptions = scalloc(sizeof(Exception) * nexceptions, 1);
- j = 0;
+ exceptions = scalloc(nexceptions, sizeof(Exception));
+
+ i = 0;
while ((mysql_row = mysql_fetch_row(mysql_res))) {
- exceptions[j].mask = sstrdup(mysql_row[0]);
- exceptions[j].limit = atoi(mysql_row[1]);
- snprintf(exceptions[j].who, NICKMAX, "%s", mysql_row[2]);
- exceptions[j].reason = sstrdup(mysql_row[3]);
- exceptions[j].time = atoi(mysql_row[4]);
- exceptions[j].expires = atoi(mysql_row[5]);
- j++;
+ 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);
}
-#define HASH(host) ((tolower((host)[0])&31)<<5 | (tolower((host)[1])&31))
-
void db_mysql_load_os_dbase(void)
{
- char sqlcmd[MAX_SQL_BUF];
Akill *ak;
- SXLine *sx;
- int akc, sgc, sqc, szc;
+ SXLine *sl;
+ int akc, sglc, sqlc, szlc;
if (!do_mysql)
return;
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `maxusercnt`,`maxusertime`,`akills_count`,`sglines_count`,`sqlines_count`,`szlines_count` FROM `anope_os_core`;");
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- return;
- }
- mysql_res = mysql_store_result(mysql);
+ db_mysql_try
+ ("SELECT maxusercnt, maxusertime, akills_count, sglines_count, "
+ "sqlines_count, szlines_count FROM anope_os_core");
+
+ mysql_res = mysql_use_result(mysql);
+
if ((mysql_row = mysql_fetch_row(mysql_res))) {
- maxusercnt = atoi(mysql_row[0]);
- maxusertime = atoi(mysql_row[1]);
- akc = atoi(mysql_row[2]);
- sgc = atoi(mysql_row[3]);
- sqc = atoi(mysql_row[4]);
- szc = atoi(mysql_row[5]);
+ 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 = sgc = sqc = szc = 0;
+ akc = 0;
+ sglc = 0;
+ sqlc = 0;
+ szlc = 0;
}
+
mysql_free_result(mysql_res);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `user`,`host`,`xby`,`reason`,`seton`,`expire` FROM `anope_os_akills`;");
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- return;
- }
- mysql_res = mysql_store_result(mysql);
+
+ /* Load the AKILLs */
+
+ db_mysql_try
+ ("SELECT user, host, xby, reason, seton, expire FROM anope_os_akills");
+
+ mysql_res = mysql_use_result(mysql);
slist_setcapacity(&akills, akc);
+
while ((mysql_row = mysql_fetch_row(mysql_res))) {
- ak = scalloc(sizeof(Akill), 1);
+ ak = 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 = atoi(mysql_row[4]);
- ak->expires = atoi(mysql_row[5]);
+ 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);
- slist_setcapacity(&sglines, sgc);
- slist_setcapacity(&sqlines, sqc);
- slist_setcapacity(&szlines, szc);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `mask`,`xby`,`reason`,`seton`,`expire` FROM `anope_os_sglines`;");
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql statement: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- return;
- }
- mysql_res = mysql_store_result(mysql);
+ /* Load the SGLINEs */
+
+ db_mysql_try
+ ("SELECT mask, xby, reason, seton, expire FROM anope_os_sglines WHERE active = 1");
+
+ mysql_res = mysql_use_result(mysql);
+ slist_setcapacity(&sglines, sglc);
+
while ((mysql_row = mysql_fetch_row(mysql_res))) {
- sx = scalloc(sizeof(SXLine), 1);
- sx->mask = sstrdup(mysql_row[0]);
- sx->by = sstrdup(mysql_row[1]);
- sx->reason = sstrdup(mysql_row[2]);
- sx->seton = atoi(mysql_row[3]);
- sx->expires = atoi(mysql_row[4]);
- slist_add(&sglines, sx);
+ sl = 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);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `mask`,`xby`,`reason`,`seton`,`expire` FROM `anope_os_sqlines`;");
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql statement: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- return;
- }
- mysql_res = mysql_store_result(mysql);
+
+ /* Load the SQLINEs */
+
+ db_mysql_try
+ ("SELECT mask, xby, reason, seton, expire FROM anope_os_sqlines WHERE active = 1");
+
+ mysql_res = mysql_use_result(mysql);
+ slist_setcapacity(&sqlines, sqlc);
+
while ((mysql_row = mysql_fetch_row(mysql_res))) {
- sx = scalloc(sizeof(SXLine), 1);
- sx->mask = sstrdup(mysql_row[0]);
- sx->by = sstrdup(mysql_row[1]);
- sx->reason = sstrdup(mysql_row[2]);
- sx->seton = atoi(mysql_row[3]);
- sx->expires = atoi(mysql_row[4]);
- slist_add(&sqlines, sx);
+ sl = 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);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `mask`,`xby`,`reason`,`seton`,`expire` FROM `anope_os_szlines`;");
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql statement: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- return;
- }
- mysql_res = mysql_store_result(mysql);
+
+ /* Load the SZLINEs */
+
+ db_mysql_try
+ ("SELECT mask, xby, reason, seton, expire FROM anope_os_szlines WHERE active = 1");
+
+ mysql_res = mysql_use_result(mysql);
+ slist_setcapacity(&szlines, szlc);
+
while ((mysql_row = mysql_fetch_row(mysql_res))) {
- sx = scalloc(sizeof(SXLine), 1);
- sx->mask = sstrdup(mysql_row[0]);
- sx->by = sstrdup(mysql_row[1]);
- sx->reason = sstrdup(mysql_row[2]);
- sx->seton = atoi(mysql_row[3]);
- sx->expires = atoi(mysql_row[4]);
- slist_add(&szlines, sx);
+ sl = 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);
}
-#undef HASH
-
void db_mysql_load_cs_dbase(void)
{
- char sqlcmd[MAX_SQL_BUF], *tempstr;
+ char *q_name;
ChannelInfo *ci;
- int n_levels, j;
+ int i;
MYSQL_RES *res;
MYSQL_ROW row;
if (!do_mysql)
return;
- snprintf(sqlcmd, MAX_SQL_BUF,
- "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`");
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- return;
- }
+ 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");
+
+ /* 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);
- if (mysql_num_rows(mysql_res) == 0) {
- mysql_free_result(mysql_res);
- return;
- }
+
while ((mysql_row = mysql_fetch_row(mysql_res))) {
- ci = scalloc(sizeof(ChannelInfo), 1);
+ ci = scalloc(1, sizeof(ChannelInfo));
+
+ /* Name, founder, successor, password */
snprintf(ci->name, CHANMAX, "%s", mysql_row[0]);
ci->founder = findcore(mysql_row[1]);
ci->successor = findcore(mysql_row[2]);
snprintf(ci->founderpass, PASSMAX, "%s", mysql_row[3]);
+
+ /* Description, URL, email -- scalloc() initializes to 0/NULL */
ci->desc = sstrdup(mysql_row[4]);
- ci->url = sstrdup(mysql_row[5]);
- if (strlen(ci->url) == 0) {
- free(ci->url);
- ci->url = NULL;
- }
- ci->email = sstrdup(mysql_row[6]);
- if (strlen(ci->email) == 0) {
- free(ci->email);
- ci->email = NULL;
- }
- ci->time_registered = atoi(mysql_row[7]);
- ci->last_used = atoi(mysql_row[8]);
+ 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 = atoi(mysql_row[11]);
- ci->flags = atoi(mysql_row[12]);
-
- ci->flags &= ~CI_INHABIT;
+ 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 = atoi(mysql_row[15]);
-
- tempstr = db_mysql_quote(ci->name);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `position`,`level` FROM `anope_cs_levels` WHERE `channel` = '%s'",
- tempstr);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- return;
- }
- res = mysql_store_result(mysql);
- n_levels = mysql_num_rows(res);
- ci->levels = scalloc(2 * CA_SIZE, 1);
+ 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 */
+ 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);
+
while ((row = mysql_fetch_row(res))) {
- ci->levels[atoi(row[0])] = atoi(row[1]);
+ i = strtol(row[0], (char **) NULL, 10);
+ ci->levels[i] = strtol(row[1], (char **) NULL, 10);
}
+
mysql_free_result(res);
- ci->accesscount = atoi(mysql_row[16]);
- if (ci->accesscount) {
+
+ /* Get the channel ACCESS list */
+ if (ci->accesscount > 0) {
ci->access = scalloc(ci->accesscount, sizeof(ChanAccess));
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `in_use`,`level`,`display`,`last_seen` FROM `anope_cs_access` WHERE `channel` = '%s'",
- tempstr);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- return;
- }
+
+ 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);
- j = 0;
+
+ i = 0;
while ((row = mysql_fetch_row(res))) {
- ci->access[j].in_use = atoi(row[0]);
- if (ci->access[j].in_use) {
- ci->access[j].level = atoi(row[1]);
- ci->access[j].nc = findcore(row[2]);
- if (ci->access[j].nc == NULL)
- ci->access[j].in_use = 0;
- ci->access[j].last_seen = atoi(row[3]);
- }
- j++;
+ 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);
- } else {
- ci->access = NULL;
}
- ci->akickcount = atoi(mysql_row[17]);
- if (ci->akickcount) {
+
+ /* Get the channel AKICK list */
+ if (ci->akickcount > 0) {
ci->akick = scalloc(ci->akickcount, sizeof(AutoKick));
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `flags`,`dmask`,`reason`,`creator`,`addtime` FROM `anope_cs_akicks` WHERE `channel` = '%s'",
- tempstr);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- return;
- }
- res = mysql_store_result(mysql);
- j = 0;
+
+ 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[j].flags = atoi(row[0]);
- if (ci->akick[j].flags & AK_USED) {
- if (ci->akick[j].flags & AK_ISNICK) {
- ci->akick[j].u.nc = findcore(row[1]);
- if (!ci->akick[j].u.nc)
- ci->akick[j].flags &= ~AK_USED;
- } else {
- ci->akick[j].u.mask = sstrdup(row[1]);
- }
- ci->akick[j].reason = sstrdup(row[2]);
- ci->akick[j].creator = sstrdup(row[3]);
- ci->akick[j].addtime = atoi(row[4]);
+ 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]);
}
- j++;
+ 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);
- } else {
- ci->akick = NULL;
- }
- ci->mlock_on = atoi(mysql_row[18]);
- ci->mlock_off = atoi(mysql_row[19]);
- ci->mlock_limit = atoi(mysql_row[20]);
- ci->mlock_key = sstrdup(mysql_row[21]);
- ci->mlock_flood = sstrdup(mysql_row[22]);
- ci->mlock_redirect = sstrdup(mysql_row[23]);
- ci->memos.memomax = atoi(mysql_row[25]);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `number`,`flags`,`time`,`sender`,`text` FROM `anope_ms_info` WHERE `receiver` = '%s'",
- tempstr);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
}
+
+ /* 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) {
+
+ if (ci->memos.memocount > 0) {
Memo *memos;
- memos = scalloc(sizeof(Memo) * ci->memos.memocount, 1);
+
+ memos = scalloc(ci->memos.memocount, sizeof(Memo));
ci->memos.memos = memos;
+
+ i = 0;
while ((row = mysql_fetch_row(res))) {
- memos->number = atoi(row[0]);
- memos->flags = atoi(row[1]);
- memos->time = atoi(row[2]);
- snprintf(memos->sender, NICKMAX, "%s", row[3]);
- memos->text = sstrdup(row[4]);
- memos->moduleData = NULL;
- memos++;
+ 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);
- ci->entry_message = sstrdup(mysql_row[24]);
- if (strlen(ci->entry_message) == 0) {
- free(ci->entry_message);
- ci->entry_message = NULL;
- }
- ci->c = NULL;
- ci->bi = findbot(mysql_row[26]);
- ci->botflags = atoi(mysql_row[27]);
- ci->capsmin = atoi(mysql_row[30]);
- ci->capspercent = atoi(mysql_row[31]);
- ci->floodlines = atoi(mysql_row[32]);
- ci->floodsecs = atoi(mysql_row[33]);
- ci->repeattimes = atoi(mysql_row[34]);
-
- ci->ttb = scalloc(2 * TTB_SIZE, 1);
- snprintf(sqlcmd, MAX_SQL_BUF, "SELECT `ttb_id`, `value` FROM `anope_cs_ttb` WHERE `channel` = '%s'", tempstr);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- }
- res = mysql_store_result(mysql);
+ /* 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);
+
while ((row = mysql_fetch_row(res))) {
- j = atoi(row[0]);
- ci->ttb[j] = atoi(row[1]);
- }
- for (j = 0; j < TTB_SIZE; j++) {
- if (!ci->ttb[j])
- ci->ttb[j] = 0;
+ 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);
}
- ci->bwcount = atoi(mysql_row[29]);
- if (ci->bwcount) {
+ mysql_free_result(res);
+
+ /* Get the badwords */
+ if (ci->bwcount > 0) {
ci->badwords = scalloc(ci->bwcount, sizeof(BadWord));
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `word`,`type` FROM `anope_cs_badwords` WHERE `channel` = '%s'",
- tempstr);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- }
- res = mysql_store_result(mysql);
- j = 0;
+
+ db_mysql_try("SELECT word, type FROM anope_cs_badwords WHERE "
+ "channel = '%s' AND active = 1", q_name);
+
+ res = mysql_use_result(mysql);
+
+ i = 0;
while ((row = mysql_fetch_row(res))) {
- ci->badwords[j].in_use = 1;
- if (ci->badwords[j].in_use) { /* I know... but for later */
- ci->badwords[j].word = sstrdup(row[0]);
- ci->badwords[j].type = atoi(row[1]);
- }
- j++;
+ 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);
- } else {
- ci->badwords = NULL;
}
+
+ /* YAY! all done; free q_name and insert the channel */
+ free(q_name);
alpha_insert_chan(ci);
- free(tempstr);
}
+
mysql_free_result(mysql_res);
- for (j = 0; j < 256; j++) {
+ /* 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[j]; ci; ci = 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",
@@ -1377,218 +1518,218 @@ void db_mysql_load_cs_dbase(void)
void db_mysql_load_ns_req_dbase(void)
{
- char sqlcmd[MAX_SQL_BUF];
NickRequest *nr;
if (!do_mysql)
return;
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `nick`,`passcode`,`password`,`email`,`requested`,`active` FROM `anope_ns_request`;");
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- return;
- }
- mysql_res = mysql_store_result(mysql);
- if (mysql_num_rows(mysql_res) == 0) {
- mysql_free_result(mysql_res);
- return;
- }
+ db_mysql_try("SELECT nick, passcode, password, email, requested FROM "
+ "anope_ns_request WHERE active = 1");
+
+ mysql_res = mysql_use_result(mysql);
+
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 = atoi(mysql_row[4]);
+ nr->requested = strtol(mysql_row[4], (char **) NULL, 10);
+
insert_requestnick(nr);
}
+
mysql_free_result(mysql_res);
}
void db_mysql_load_ns_dbase(void)
{
- char sqlcmd[MAX_SQL_BUF], *tmpstr;
+ char *q_display;
NickCore *nc;
NickAlias *na;
MYSQL_RES *res;
MYSQL_ROW row;
- int i, j;
+ int i;
if (!do_mysql)
return;
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `display`,`pass`,`email`,`icq`,`url`,`flags`,`language`,`accesscount`,`memocount`,`memomax`,`channelcount`,`channelmax`,`greet`,`active` FROM `anope_ns_core`");
+ 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 (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- return;
- }
+ /* 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);
- if (mysql_num_rows(mysql_res) == 0) {
- mysql_free_result(mysql_res);
- return;
- }
while ((mysql_row = mysql_fetch_row(mysql_res))) {
nc = scalloc(1, sizeof(NickCore));
+ /* Display, password, email, ICQ, URL, flags */
nc->display = sstrdup(mysql_row[0]);
nc->pass = sstrdup(mysql_row[1]);
nc->email = sstrdup(mysql_row[2]);
- nc->icq = atoi(mysql_row[3]);
+ nc->icq = strtol(mysql_row[3], (char **) NULL, 10);
nc->url = sstrdup(mysql_row[4]);
- nc->flags = atoi(mysql_row[5]);
- nc->language = atoi(mysql_row[6]);
- nc->accesscount = atoi(mysql_row[7]);
- nc->memos.memocount = atoi(mysql_row[8]);
- nc->memos.memomax = atoi(mysql_row[9]);
- nc->channelcount = atoi(mysql_row[10]);
- nc->channelmax = atoi(mysql_row[11]);
-
- if (mysql_row[12][0] == '\0') /* check if it's empty */
- nc->greet = NULL;
- else
+ 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, channelmax, greet */
+ nc->channelcount = strtol(mysql_row[10], (char **) NULL, 10);
+ nc->channelmax = strtol(mysql_row[11], (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);
- if (nc->accesscount) {
- char **access;
- access = scalloc(sizeof(char *) * nc->accesscount, 1);
- nc->access = access;
- tmpstr = db_mysql_quote(nc->display);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `access` FROM `anope_ns_access` WHERE `display` = '%s'",
- tmpstr);
- free(tmpstr);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- }
- res = mysql_store_result(mysql);
+
+ /* Get info from other tables; we'll need the display */
+ q_display = db_mysql_quote(nc->display);
+
+ /* Fill the accesslist */
+ if (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);
+
+ res = mysql_use_result(mysql);
+
+ i = 0;
while ((row = mysql_fetch_row(res))) {
- if (strlen(row[0]) > 0) {
- *access = sstrdup(row[0]);
- access++;
+ if (row[0] && *(row[0])) {
+ nc->access[i] = sstrdup(row[0]);
+ i++;
}
}
+
mysql_free_result(res);
}
- if (nc->memos.memocount) {
- Memo *memos;
- memos = scalloc(sizeof(Memo) * nc->memos.memocount, 1);
- nc->memos.memos = memos;
- tmpstr = db_mysql_quote(nc->display);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `number`,`flags`,`time`,`sender`,`text` FROM `anope_ms_info` WHERE `receiver` = '%s' ORDER BY `number` ASC",
- tmpstr);
- free(tmpstr);
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- }
- res = mysql_store_result(mysql);
+ /* Load the memos */
+ if (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);
+
+ res = mysql_use_result(mysql);
+
+ i = 0;
while ((row = mysql_fetch_row(res))) {
- memos->number = atoi(row[0]);
- memos->flags = atoi(row[1]);
- memos->time = atoi(row[2]);
- snprintf(memos->sender, NICKMAX, "%s", row[3]);
- memos->text = sstrdup(row[4]);
- memos->moduleData = NULL;
- memos++;
+ 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);
- snprintf(sqlcmd, MAX_SQL_BUF,
- "SELECT `display`,`nick`,`time_registered`,`last_seen`,`status`,`last_usermask`,`last_realname`,`last_quit` FROM `anope_ns_alias`");
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- }
- mysql_res = mysql_store_result(mysql);
+
+ /* 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");
+
+ 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 = scalloc(1, sizeof(NickAlias));
- na->nick = sstrdup(mysql_row[1]);
+ /* 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]);
- na->time_registered = atoi(mysql_row[2]);
- na->last_seen = atoi(mysql_row[3]);
- na->status = atoi(mysql_row[4]);
- na->status &= ~NS_TEMPORARY;
- tmpstr = sstrdup(mysql_row[0]);
- na->nc = findcore(tmpstr);
- free(tmpstr);
-
- if (na->nc)
- slist_add(&na->nc->aliases, na);
-
- if (!(na->status & NS_VERBOTEN)) {
- if (!na->last_usermask)
- na->last_usermask = sstrdup("");
- if (!na->last_realname)
- na->last_realname = sstrdup("");
+
+ /* Assign to the nickcore aliases */
+ slist_add(&na->nc->aliases, na);
+
+ /* Make sure the SERVICES_ROOT flag is only set for services roots */
+ na->nc->flags &= ~NI_SERVICES_ROOT;
+ for (i = 0; i < RootNumber; i++) {
+ if (stricmp(ServicesRoots[i], na->nick))
+ na->nc->flags |= NI_SERVICES_ROOT;
}
- if (na->nc)
- na->nc->flags &= ~NI_SERVICES_ROOT;
+ /* Last, but not least: insert the alias! */
alpha_insert_alias(na);
}
- mysql_free_result(mysql_res);
- for (j = 0; j < 1024; j++) {
- NickAlias *next;
- for (na = nalists[j]; na; na = next) {
- next = na->next;
- if (!na->nc) {
- alog("%s: while loading database: %s has no core! We delete it.", s_NickServ, na->nick);
- delnick(na);
- continue;
- }
- for (i = 0; i < RootNumber; i++) {
- if (!stricmp(ServicesRoots[i], na->nick))
- na->nc->flags |= NI_SERVICES_ROOT;
- }
- }
- }
+ mysql_free_result(mysql_res);
}
/* get random mysql number for the generator */
unsigned int mysql_rand(void)
{
- char sqlcmd[MAX_SQL_BUF];
unsigned int num = 0;
+
if (!do_mysql)
return 0;
- snprintf(sqlcmd, MAX_SQL_BUF, "SELECT RAND()");
- if (db_mysql_query(sqlcmd)) {
- log_perror("Can't create sql query: %s", sqlcmd);
- db_mysql_error(MYSQL_WARNING, "query");
- }
+
+ db_mysql_try("SELECT RAND()");
+
mysql_res = mysql_store_result(mysql);
- if (mysql_num_rows(mysql_res) == 0) {
+
+ if (!(mysql_row = mysql_fetch_row(mysql_res))) {
mysql_free_result(mysql_res);
return 0;
}
- mysql_row = mysql_fetch_row(mysql_res);
- num = (atoi(mysql_row[0]) * UserKey3);
+
+ num = UserKey3 * strtol(mysql_row[0], (char **) NULL, 10);
+
mysql_free_result(mysql_res);
+
return num;
}