summaryrefslogtreecommitdiff
path: root/mysql.c
diff options
context:
space:
mode:
authorkeeper keeper@31f1291d-b8d6-0310-a050-a5561fc1590b <keeper keeper@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2004-03-31 18:25:42 +0000
committerkeeper keeper@31f1291d-b8d6-0310-a050-a5561fc1590b <keeper keeper@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2004-03-31 18:25:42 +0000
commit8efb093193805c6b57377769cca178f02e31ab5b (patch)
tree974dd69e8604c8a7a78a2ad9d357b8dc4eedc5ea /mysql.c
parent6f9bbb2d39e28780c5b2b2d3cbf617b54727b11c (diff)
BUILD : 1.7.0 (17) BUGS : NOTES : Implemented MySQL Phase 2, see Changes and docs/MYSQL file for information.
git-svn-id: svn://svn.anope.org/anope/trunk@17 31f1291d-b8d6-0310-a050-a5561fc1590b git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@10 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'mysql.c')
-rw-r--r--mysql.c669
1 files changed, 668 insertions, 1 deletions
diff --git a/mysql.c b/mysql.c
index e25f3aace..cda32b776 100644
--- a/mysql.c
+++ b/mysql.c
@@ -58,8 +58,10 @@ int db_mysql_init()
do_mysql = 1;
alog("MySQL has been enabled.");
}
+ if (!db_mysql_open())
+ do_mysql = 0;
+
return 1;
-
}
/*************************************************************************/
@@ -103,6 +105,10 @@ int db_mysql_query(char *sql)
{
int result, lcv;
+ char *s = db_mysql_quote(sql);
+
+ if(debug) alog(s);
+ free(s);
result = mysql_query(mysql, sql);
@@ -867,3 +873,664 @@ void db_mysql_save_bs_core(BotInfo * bi)
}
/*************************************************************************/
+
+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`");
+
+ 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);
+ 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]);
+ }
+ 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`");
+
+ 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);
+ 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);
+ }
+ mysql_free_result(mysql_res);
+}
+
+void db_mysql_load_news(void)
+{
+ char sqlcmd[MAX_SQL_BUF];
+ int j;
+
+ 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");
+ }
+ 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;
+ else news_size = 2 * nnews;
+ news = scalloc(sizeof(*news) * news_size, 1);
+ if (!nnews) {
+ mysql_free_result(mysql_res);
+ return;
+ }
+ j = 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++;
+ }
+ mysql_free_result(mysql_res);
+}
+
+void db_mysql_load_exceptions(void)
+{
+ char sqlcmd[MAX_SQL_BUF];
+ int j;
+
+ 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");
+ }
+ mysql_res = mysql_store_result(mysql);
+ nexceptions = mysql_num_rows(mysql_res);
+ exceptions = scalloc(sizeof(Exception) * nexceptions, 1);
+ j = 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++;
+ }
+ 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;
+ HostCache *hc;
+ int akc,sgc,sqc,szc,j;
+
+ 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");
+ }
+ mysql_res = mysql_store_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]);
+ } else {
+ maxusercnt = 0;
+ maxusertime = time(NULL);
+ akc = sgc = sqc = szc = 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");
+ }
+ mysql_res = mysql_store_result(mysql);
+ slist_setcapacity(&akills,akc);
+ while((mysql_row = mysql_fetch_row(mysql_res))) {
+ ak = scalloc(sizeof(Akill), 1);
+ 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]);
+ 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");
+ }
+ mysql_res = mysql_store_result(mysql);
+ 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);
+ }
+ 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");
+ }
+ mysql_res = mysql_store_result(mysql);
+ 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);
+ }
+ 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");
+ }
+ mysql_res = mysql_store_result(mysql);
+ 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);
+ }
+ mysql_free_result(mysql_res);
+
+ snprintf(sqlcmd,MAX_SQL_BUF,"SELECT `mask`,`status`,`used` FROM `anope_os_hcache`");
+ 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);
+ if (mysql_num_rows(mysql_res) == 0) {
+ mysql_free_result(mysql_res);
+ return;
+ }
+ while ((mysql_row = mysql_fetch_row(mysql_res))) {
+ j = HASH(mysql_row[0]);
+ hc = scalloc(1, sizeof(HostCache));
+ hc->host = sstrdup(mysql_row[0]);
+ hc->status = atoi(mysql_row[1]);
+ hc->used = atoi(mysql_row[2]);
+
+ hc->prev = NULL;
+ hc->next = hcache[j];
+ if (hc->next)
+ hc->next->prev = hc;
+ hcache[j] = hc;
+ }
+ mysql_free_result(mysql_res);
+}
+
+#undef HASH
+
+void db_mysql_load_cs_dbase(void)
+{
+ char sqlcmd[MAX_SQL_BUF], *tempstr;
+ ChannelInfo *ci;
+ int n_levels, j;
+ 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`,`ttb`,`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");
+ }
+ 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);
+ 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]);
+ 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]);
+ 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]);
+#ifdef USE_ENCRYPTION
+ if (!(ci->flags & (CI_ENCRYPTEDPW | CI_VERBOTEN))) {
+ if (debug)
+ alog("debug: %s: encrypting password for %s on load",s_ChanServ,ci->name);
+ if (encrypt_in_place(ci->founderpass, PASSMAX) < 0)
+ fatal("%s: load database: Can't encrypt %s password!",s_ChanServ,ci->name);
+ ci->flags |= CI_ENCRYPTEDPW;
+ }
+#else
+ if (ci->flags & CI_ENCRYPTEDPW) {
+ fatal("%s: load database: password for %s encrypted but encryption disabled, aborting",s_ChanServ,ci->name);
+ }
+#endif
+ ci->flags &= ~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");
+ }
+ res = mysql_store_result(mysql);
+ n_levels = mysql_num_rows(res);
+ ci->levels = scalloc(2 * CA_SIZE, 1);
+ reset_levels(ci);
+ while((row = mysql_fetch_row(res))) {
+ ci->levels[atoi(row[0])] = atoi(row[1]);
+ }
+ mysql_free_result(res);
+ ci->accesscount = atoi(mysql_row[16]);
+ if (ci->accesscount) {
+ 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");
+ }
+ res = mysql_store_result(mysql);
+ j = 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++;
+ }
+ mysql_free_result(res);
+ } else {
+ ci->access = NULL;
+ }
+ ci->akickcount = atoi(mysql_row[17]);
+ if (ci->akickcount) {
+ 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");
+ }
+ res = mysql_store_result(mysql);
+ j = 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]);
+ }
+ j++;
+ }
+ 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]);
+#ifdef HAS_FMODE
+ ci->mlock_flood = sstrdup(mysql_row[22]);
+#endif
+
+#ifdef HAS_LMODE
+ ci->mlock_redirect = sstrdup(mysql_row[23]);
+#endif
+ 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");
+ }
+ res = mysql_store_result(mysql);
+ ci->memos.memocount = mysql_num_rows(res);
+ if (ci->memos.memocount) {
+ Memo *memos;
+ memos = scalloc(sizeof(Memo) * ci->memos.memocount, 1);
+ ci->memos.memos = memos;
+ 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++;
+ }
+ }
+ 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->ttb = scalloc(2 * TTB_SIZE, 1);
+ for (j = 0; j < TTB_SIZE; j++) {
+ ci->ttb[j] = 0;
+ }
+ 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->bwcount = atoi(mysql_row[29]);
+ if (ci->bwcount) {
+ 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;
+ 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++;
+ }
+ mysql_free_result(res);
+ } else {
+ ci->badwords = NULL;
+ }
+ alpha_insert_chan(ci);
+ free(tempstr);
+ }
+ mysql_free_result(mysql_res);
+
+ for (j = 0; j < 256; j++) {
+ ChannelInfo *next;
+ for (ci = chanlists[j]; ci; ci = next) {
+ next = ci->next;
+ if (!(ci->flags & CI_VERBOTEN) && !ci->founder) {
+ alog("%s: database load: Deleting founderless channel %s",s_ChanServ,ci->name);
+ delchan(ci);
+ }
+ }
+ }
+}
+
+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_req`;");
+ 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);
+ if (mysql_num_rows(mysql_res) == 0) {
+ mysql_free_result(mysql_res);
+ return;
+ }
+ 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]);
+ insert_requestnick(nr);
+ }
+ mysql_free_result(mysql_res);
+}
+
+void db_mysql_load_ns_dbase(void)
+{
+ char sqlcmd[MAX_SQL_BUF], *tmpstr;
+ NickCore *nc;
+ NickAlias *na;
+ MYSQL_RES *res;
+ MYSQL_ROW row;
+ int i,j;
+
+ 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`");
+
+ 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);
+ 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));
+
+ 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->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]);
+ nc->greet = sstrdup(mysql_row[12]);
+
+ if (!NSAllowKillImmed)
+ nc->flags &= ~NI_KILL_IMMED;
+
+#ifdef USE_ENCRYPTION
+ if (nc->pass && !(nc->flags & NI_ENCRYPTEDPW)) {
+ if (debug)
+ alog("debug: %s: encrypting password for `%s' on load", s_NickServ, nc->display);
+ if(encrypt_in_place(nc->pass, PASSMAX) < 0)
+ fatal("%s: Can't encrypt `%s' nickname password!", s_NickServ, nc->display);
+
+ nc->flags |= NI_ENCRYPTEDPW;
+ }
+#else
+ if (nc->flags & NI_ENCRYPTEDPW)
+ fatal("%s: load database: password for %s encrypted but encryption disabled, aborting", s_NickServ, nc->display);
+#endif
+
+ 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);
+ while((row = mysql_fetch_row(res))) {
+ *access = sstrdup(row[0]);
+ access++;
+ }
+ 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);
+ 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++;
+ }
+ mysql_free_result(res);
+ }
+ 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);
+ while((mysql_row = mysql_fetch_row(mysql_res))) {
+ na = scalloc(1, sizeof(NickAlias));
+ na->nick = sstrdup(mysql_row[1]);
+
+ 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);
+
+ 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("");
+ }
+
+ na->nc->flags &= ~NI_SERVICES_ROOT;
+ 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;
+ }
+ }
+ }
+}
+