1
0
mirror of https://github.com/anope/anope.git synced 2026-07-10 16:03:15 +02:00
Files
anope/src/mysql.c
T
keeper keeper@31f1291d-b8d6-0310-a050-a5561fc1590b a090c812cf BUILD : 1.7.4 (294) BUGS : NOTES : First import. Current status: anope_bs_core finished for new phase1, anope_cs_access working for cs access add.
git-svn-id: svn://svn.anope.org/anope/trunk@294 31f1291d-b8d6-0310-a050-a5561fc1590b


git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@183 5417fbe8-f217-4b02-8779-1006273d7864
2004-08-01 02:27:43 +00:00

246 lines
5.9 KiB
C

/* MySQL functions.
*
* (C) 2003 Anope Team
* Contact us at info@anope.org
*
* Please read COPYING and README for furhter details.
*
* Based on the original code of Epona by Lara.
* Based on the original code of Services by Andy Church.
*
* $Id$
*
*/
#include "services.h"
/*************************************************************************/
#ifdef USE_MYSQL
MYSQL *mysql;
MYSQL_RES *mysql_res;
MYSQL_ROW mysql_row;
int do_mysql = 0;
void db_mysql_init(void)
{
if (!MysqlPort) MysqlPort = 3306;
if (!MysqlHost && !MysqlSock) {
alog("MySQL is disabled.");
do_mysql = 0;
return;
}
if (!MysqlUser || !MysqlPass) {
alog("Missing required config directives for MySQL.");
do_mysql = 0;
return;
}
mysql = mysql_init(NULL);
if ((!mysql_real_connect(mysql, MysqlHost, MysqlUser, MysqlPass, MysqlName, MysqlPort, MysqlSock ? MysqlSock : NULL, 0))) {
alog("Unable to connect to MySQL database:");
alog(mysql_error(mysql));
do_mysql = 0;
return;
}
alog("MySQL enabled.");
do_mysql = 1;
}
void db_mysql_end(void)
{
if (do_mysql) {
mysql_close(mysql);
alog("MySQL connection closed.");
}
}
char *db_mysql_quote(char *sql)
{
char *quoted;
int len;
if (!do_mysql || !sql) return sstrdup("");
len = strlen(sql);
quoted = malloc((2*len + 1) * sizeof(char));
mysql_real_escape_string(mysql, quoted, sql, len);
return quoted;
}
int db_mysql_query(char *fmt, ...)
{
va_list args;
char *s, *sql;
int result;
if (!do_mysql) return MYSQL_ERR;
va_start(args, fmt);
sql = malloc(MAX_SQL_BUF);
vsnprintf(sql, MAX_SQL_BUF, fmt, args);
if (debug) {
s = db_mysql_quote(sql);
alog(s);
free(s);
}
result = mysql_query(mysql, sql);
if (result) {
log_perror(mysql_error(mysql));
return MYSQL_ERR;
}
va_end(args);
return MYSQL_OK;
}
void db_mysql_store_result(void)
{
mysql_res = mysql_store_result(mysql);
}
void db_mysql_free_res(void)
{
mysql_free_result(mysql_res);
}
/* BotServ */
void db_mysql_bs_add_bot(BotInfo *bi)
{
char *nick, *user, *host, *rname;
nick = db_mysql_quote(bi->nick);
user = db_mysql_quote(bi->user);
host = db_mysql_quote(bi->host);
rname = db_mysql_quote(bi->real);
db_mysql_query("INSERT INTO `anope_bs_core` (`nick`,`user`,`host`,`rname`,`flags`,`created`,`chancount`) VALUES('%s','%s','%s','%s',%d,%d,%d)",nick,user,host,rname,bi->flags, bi->created, bi->chancount);
free(nick);
free(user);
free(host);
free(rname);
}
void db_mysql_bs_del_bot(BotInfo *bi)
{
char *nick, *user, *host, *rname;
nick = db_mysql_quote(bi->nick);
user = db_mysql_quote(bi->user);
host = db_mysql_quote(bi->host);
rname = db_mysql_quote(bi->real);
db_mysql_query("DELETE FROM `anope_bs_core` WHERE `nick`='%s' AND `user`='%s' AND `host`='%s' AND `rname`='%s'",nick,user,host,rname);
free(nick);
free(user);
free(host);
free(rname);
}
void db_mysql_bs_chg_bot(BotInfo *bi, char *newnick, char *newuser, char *newhost, char *newreal)
{
char *oldnick, *nick, *user, *host, *real, *sql;
sql = malloc(MAX_SQL_BUF);
snprintf(sql, MAX_SQL_BUF, "UPDATE `anope_bs_core` SET ");
oldnick = db_mysql_quote(bi->nick);
if (!newnick) newnick = bi->nick;
if (!newuser) newuser = bi->user;
if (!newhost) newhost = bi->host;
if (!newreal) newreal = bi->real;
nick = db_mysql_quote(newnick);
strcat(sql,"`nick`='");
strcat(sql,nick);
strcat(sql,"',");
free(nick);
user = db_mysql_quote(newuser);
strcat(sql,"`user`='");
strcat(sql,user);
strcat(sql,"',");
free(user);
host = db_mysql_quote(newhost);
strcat(sql,"`host`='");
strcat(sql,host);
strcat(sql,"',");
free(host);
real = db_mysql_quote(newreal);
strcat(sql,"`rname`='");
strcat(sql,real);
strcat(sql,"' ");
free(real);
strcat(sql,"WHERE `nick`='");
strcat(sql,oldnick);
strcat(sql,"'");
db_mysql_query(sql);
free(sql);
free(oldnick);
}
void db_mysql_bs_chg_bot_chancount(BotInfo *bi)
{
char *nick;
nick = db_mysql_quote(bi->nick);
db_mysql_query("UPDATE `anope_bs_core` SET `chancount` = %d WHERE `nick` = '%s'", bi->chancount, nick);
free(nick);
}
void db_mysql_bs_chg_bot_flags(BotInfo *bi)
{
char *nick;
nick = db_mysql_quote(bi->nick);
db_mysql_query("UPDATE `anope_bs_core` SET `flags` = %d WHERE `nick` = '%s'", bi->flags, nick);
free(nick);
}
/* ChanServ */
void db_mysql_cs_add_access(ChannelInfo *ci, ChanAccess *access)
{
char *display, *channel;
display = db_mysql_quote(access->nc->display);
channel = db_mysql_quote(ci->name);
/* Check if the entry already exists */
db_mysql_query("SELECT `ca_id` FROM `anope_cs_access` WHERE `channel` = '%s' AND `display` = '%s'",channel, display);
db_mysql_store_result();
if (mysql_num_rows(mysql_res) >= 1) {
db_mysql_query("UPDATE `anope_cs_access` SET `in_use` = 1, `level` = %d, `last_seen` = %d WHERE `channel` = '%s' AND `display` = '%s'",access->level, access->last_seen, channel, display);
} else {
db_mysql_query("INSERT INTO `anope_cs_access` (`in_use`,`level`,`display`,`channel`,`last_seen`) VALUES (1, %d, '%s', '%s', %d)",access->level,display,channel,access->last_seen);
}
db_mysql_free_res();
free(channel);
free(display);
}
void db_mysql_cs_del_access(ChannelInfo *ci, ChanAccess *access)
{
char *display, *channel;
display = db_mysql_quote(access->nc->display);
channel = db_mysql_quote(ci->name);
db_mysql_query("DELETE FROM `anope_cs_access` WHERE `channel` = '%s' AND `display` = '%s'", channel, display);
free(channel);
free(display);
}
#endif /* USE_MYSQL */