mirror of
https://github.com/anope/anope.git
synced 2026-07-10 16:03:15 +02:00
a090c812cf
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
246 lines
5.9 KiB
C
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 */
|