/****************************************************************************************************/ /* MySQL Input/Output functions */ /****************************************************************************************************/ #include "mysql.h" /*****************************************************************************************************/ /* 1. connect to mysql by using the default values from services.conf */ /* the module uses an own connection to the database */ /* 2. select the database */ /* 3. check if there are the right tables, if not (first use of this module) create them */ /* 4. returns 0 if all is ok */ /*****************************************************************************************************/ int mydb_init(void) { /* initializing mysql connection */ mymysql = mysql_init(NULL); if (MysqlSock) { if ((!mysql_real_connect(mymysql, MysqlHost, MysqlUser, MysqlPass, MysqlName, MysqlPort, MysqlSock, 0))) { alog("[%s] Cant connect to MySQL: %s\n", MODNAME, mysql_error(mymysql)); alog("[%s] unloading...", MODNAME); return MOD_STOP; } } else { if ((!mysql_real_connect(mymysql, MysqlHost, MysqlUser, MysqlPass, MysqlName, MysqlPort, NULL, 0))) { alog("[%s] Cant connect to MySQL: %s\n", MODNAME, mysql_error(mymysql)); alog("[%s] unloading...", MODNAME); return MOD_STOP; } } if (mysql_select_db(mymysql, MysqlName)) { alog("[%s] Cant connect to MySQL: %s\n", MODNAME, mysql_error(mymysql)); alog("[%s] unloading...", MODNAME); return MOD_STOP; } /* checking for DBNAME table and create it, if not found */ do_query("SHOW TABLES LIKE '" DBNAME "';"); myres = mysql_store_result(mymysql); if (mysql_num_rows(myres) == 0) { do_query(DBSCHEMA); /* create a new table */ alog("[%s] Created table %s", MODNAME, DBNAME); } mysql_free_result(myres); return 0; } /*************************************************************************************************/ /* executes a mysql query */ /* input: query (escaped string) */ /* output: nothing (returns 0) */ /*************************************************************************************************/ int do_query(const char *fmt, ...) { char query[MAX_SQL_BUF]; int result, slen; va_list args; *query = '\0'; va_start(args, fmt); slen= vsnprintf(query, MAX_SQL_BUF - 1, fmt, args); va_end(args); if (debug) alog("[%s] Query: %s", MODNAME, query); mysql_ping(mymysql); /* checks for mysql connection and reconnect */ result = mysql_real_query(mymysql, query , slen); if (result) { log_perror("[%s] MySQL Error: %s", MODNAME, mysql_error(mymysql)); return 1; } return 0; } /***************************************************************************************************/ /* returns the escaped string - mysql_real_escape() */ /***************************************************************************************************/ char *quote(char *arg) { int slen; char *qbuf; if (!arg) return ""; /* dont segfault */ slen = strlen(arg); qbuf = malloc((1 + (slen * 2)) * sizeof(char)); mysql_real_escape_string(mymysql,qbuf, arg, slen); return qbuf; } /******************************************************************************************************/ /* deletes expired and dropped nicks from database */ /* adds a callback routine to start itself again and again */ /* PURGETIME is defined in addon.h */ /******************************************************************************************************/ int purgedb(int argc, char *argv[]) { /* do_query("DELETE "DBNAME".* FROM "DBNAME" " "LEFT JOIN anope_ns_alias ON "DBNAME".nick=anope_ns_alias.nick " "WHERE anope_ns_alias.nick IS NULL;"); */ if (debug) { if (mysql_affected_rows(mymysql) > 0) { send_cmd(NULL, "SENDSNO e :*services* [%s] purged database: %lu old entries removed", MODNAME, (unsigned long) mysql_affected_rows(mymysql)); alog("[%s] purged database: %lu old entries removed", MODNAME, (unsigned long) mysql_affected_rows(mymysql)); } } moduleAddCallback("PURGEDB",time(NULL)+dotime(PURGETIME),purgedb,0,NULL); return MOD_CONT; } /*********************************[END OF FILE]*********************************************************/