rdb.c

Go to the documentation of this file.
00001 /* RDB functions.
00002  *
00003  * (C) 2003-2008 Anope Team
00004  * Contact us at info@anope.org
00005  *
00006  * Please read COPYING and README for further details.
00007  *
00008  * Based on the original code of Epona by Lara.
00009  * Based on the original code of Services by Andy Church. 
00010  * 
00011  * $Id: rdb.c 1345 2008-01-13 12:54:14Z geniusdex $ 
00012  *
00013  */
00014 #include "services.h"
00015 
00016 /*************************************************************************/
00017 
00018 /* Initialize the current RDB database engine */
00019 int rdb_init()
00020 {
00021 
00022 #ifdef USE_MYSQL
00023     return db_mysql_init();
00024 #endif
00025 
00026     return 0;
00027 }
00028 
00029 /*************************************************************************/
00030 
00031 /* Check if RDB can be used to load/save data */
00032 int rdb_open()
00033 {
00034 
00035 #ifdef USE_MYSQL
00036     return db_mysql_open();     /* db_mysql_open(); */
00037 #endif
00038 
00039     return 0;
00040 }
00041 
00042 /*************************************************************************/
00043 
00044 /* Strictly spoken this should close the database. However, it's not too
00045  * efficient to close it every time after a write or so, so we just
00046  * pretend we closed it while in reality it's still open.
00047  */
00048 int rdb_close()
00049 {
00050 
00051 #ifdef USE_MYSQL
00052     return 1;                   /* db_mysql_close(); */
00053 #endif
00054 
00055     return 1;
00056 }
00057 
00058 /*************************************************************************/
00059 
00060 /* Quote the string to be used in inclused for the current RDB database */
00061 char *rdb_quote(char *str)
00062 {
00063 #ifdef USE_MYSQL
00064     return db_mysql_quote(str);
00065 #endif
00066 
00067     return sstrdup(str);
00068 }
00069 
00070 /*************************************************************************/
00071 
00072 /* Tag a table by setting the 'active' field to 0 for all rows. After an
00073  * update, all rows with active still 0 will be deleted; this is done to
00074  * easily delete old entries from the database.
00075  */
00076 int rdb_tag_table(char *table)
00077 {
00078 #ifdef USE_MYSQL
00079     return db_mysql_try("UPDATE %s SET active = 0", table);
00080 #endif
00081 
00082     return 0;
00083 
00084 }
00085 
00086 /* Be sure to quote all user input in the clause! */
00087 int rdb_tag_table_where(char *table, char *clause)
00088 {
00089 #ifdef USE_MYSQL
00090     return db_mysql_try("UPDATE %s SET active = 0 WHERE %s", table,
00091                         clause);
00092 #endif
00093 
00094     return 0;
00095 
00096 }
00097 
00098 /*************************************************************************/
00099 
00100 /* Empty an entire database table */
00101 int rdb_empty_table(char *table)
00102 {
00103 #ifdef USE_MYSQL
00104     return db_mysql_try("TRUNCATE TABLE %s", table);
00105 #endif
00106 
00107     return 0;
00108 
00109 }
00110 
00111 /*************************************************************************/
00112 
00113 /* Clean up a table with 'dirty' records (active = 0) */
00114 int rdb_clean_table(char *table)
00115 {
00116 #ifdef USE_MYSQL
00117     return db_mysql_try("DELETE FROM %s WHERE active = 0", table);
00118 #endif
00119 
00120     return 0;
00121 }
00122 
00123 /* Be sure to quote user input in the clause! */
00124 int rdb_clean_table_where(char *table, char *clause)
00125 {
00126 #ifdef USE_MYSQL
00127     return db_mysql_try("DELETE FROM %s WHERE active = 0 AND (%s)", table,
00128                         clause);
00129 #endif
00130 
00131     return 0;
00132 }
00133 
00134 /*************************************************************************/
00135 
00136 /* Delete specific records from a table. The clause is MySQL syntax, and
00137  * should be all quoted up nicely in the calling code.
00138  */
00139 int rdb_scrub_table(char *table, char *clause)
00140 {
00141 #ifdef USE_MYSQL
00142     return db_mysql_try("DELETE FROM %s WHERE %s", table, clause);
00143 #endif
00144 
00145     return 0;
00146 
00147 }
00148 
00149 /*************************************************************************/
00150 
00151 /* Execute a direct MySQL query. Do NOT forget to quote all user input!
00152  * NOTE: this ideally shouldn't be used, but that's probably a phase3 utopia
00153  */
00154 int rdb_direct_query(char *query)
00155 {
00156 
00157 #ifdef USE_MYSQL
00158     alog("Direct Query: %s", query);
00159     return db_mysql_query(query);
00160 #endif
00161 
00162     return 0;
00163 
00164 }
00165 
00166 /*************************************************************************/
00167 
00168 /* Update the needed tables when someone changes their display.
00169  * The original author didn't even like this (claimed it should be in
00170  * mysql.c), and i do agree muchly.
00171  */
00172 int rdb_ns_set_display(char *newnick, char *oldnick)
00173 {
00174     int ret = 0;
00175     char *q_newnick;
00176     char *q_oldnick;
00177 
00178     q_newnick = rdb_quote(newnick);
00179     q_oldnick = rdb_quote(oldnick);
00180 
00181 #ifdef USE_MYSQL
00182     /* Change the display on NS_CORE */
00183     ret =
00184         db_mysql_try
00185         ("UPDATE anope_ns_core SET display = '%s' WHERE display = '%s'",
00186          q_newnick, q_oldnick);
00187 
00188     /* Change the display on NS_ALIAS for all grouped nicks */
00189     if (ret)
00190         ret =
00191             db_mysql_try
00192             ("UPDATE anope_ns_alias SET display='%s' WHERE display='%s'",
00193              q_newnick, q_oldnick);
00194 
00195     /* Change the display on ChanServ ACCESS list */
00196     if (ret)
00197         ret =
00198             db_mysql_try
00199             ("UPDATE anope_cs_access SET display='%s' WHERE display='%s'",
00200              q_newnick, q_oldnick);
00201 
00202     /* Change the display on ChanServ AKICK list */
00203     if (ret)
00204         ret =
00205             db_mysql_try
00206             ("UPDATE anope_cs_akicks SET creator='%s' WHERE creator='%s'",
00207              q_newnick, q_oldnick);
00208 
00209     /* Change the display on MemoServ sent memos -- is it required? */
00210     if (ret)
00211         ret =
00212             db_mysql_try
00213             ("UPDATE anope_ms_info SET sender='%s' WHERE sender='%s'",
00214              q_newnick, q_oldnick);
00215 
00216     /* Change the display on MemoServ received memos -- is it required? */
00217     if (ret)
00218         ret =
00219             db_mysql_try
00220             ("UPDATE anope_ms_info SET receiver='%s' WHERE receiver='%s'",
00221              q_newnick, q_oldnick);
00222 
00223     /* Change the akills set on the person's nick */
00224     if (ret)
00225         ret =
00226             db_mysql_try
00227             ("UPDATE anope_cs_akicks SET dmask='%s' WHERE dmask='%s' AND flags & %d",
00228              q_newnick, q_oldnick, AK_ISNICK);
00229 
00230     /* Change the display on NickServ ACCESS list */
00231     if (ret)
00232         ret =
00233             db_mysql_try
00234             ("UPDATE anope_ns_access SET display='%s' WHERE display='%s'",
00235              q_newnick, q_oldnick);
00236 
00237     /* No need to update anope_cs_info here as it is updated when we
00238      * save the database.
00239      *
00240      * anope_hs_core is per nick, not per display; a changed display
00241      * won't change anything there
00242      */
00243 
00244 #endif
00245 
00246     free(q_newnick);
00247     free(q_oldnick);
00248 
00249     return ret;
00250 }
00251 
00252 /*************************************************************************/
00253 
00254 int rdb_save_ns_core(NickCore * nc)
00255 {
00256 
00257 #ifdef USE_MYSQL
00258     return db_mysql_save_ns_core(nc);
00259 #endif
00260 
00261     return 0;
00262 }
00263 
00264 /*************************************************************************/
00265 
00266 int rdb_save_ns_alias(NickAlias * na)
00267 {
00268 
00269 #ifdef USE_MYSQL
00270     return db_mysql_save_ns_alias(na);
00271 #endif
00272 
00273     return 0;
00274 }
00275 
00276 /*************************************************************************/
00277 
00278 int rdb_save_ns_req(NickRequest * nr)
00279 {
00280 
00281 #ifdef USE_MYSQL
00282     return db_mysql_save_ns_req(nr);
00283 #endif
00284 
00285     return 0;
00286 }
00287 
00288 /*************************************************************************/
00289 
00290 int rdb_save_cs_info(ChannelInfo * ci)
00291 {
00292 
00293 #ifdef USE_MYSQL
00294     return db_mysql_save_cs_info(ci);
00295 #endif
00296 
00297     return 0;
00298 }
00299 
00300 /*************************************************************************/
00301 
00302 int rdb_save_bs_core(BotInfo * bi)
00303 {
00304 
00305 #ifdef USE_MYSQL
00306     return db_mysql_save_bs_core(bi);
00307 #endif
00308 
00309     return 0;
00310 }
00311 
00312 /*************************************************************************/
00313 
00314 int rdb_save_hs_core(HostCore * hc)
00315 {
00316 
00317 #ifdef USE_MYSQL
00318     return db_mysql_save_hs_core(hc);
00319 #endif
00320 
00321     return 0;
00322 }
00323 
00324 /*************************************************************************/
00325 
00326 int rdb_save_os_db(unsigned int maxucnt, unsigned int maxutime,
00327                    SList * ak, SList * sgl, SList * sql, SList * szl)
00328 {
00329 
00330 #ifdef USE_MYSQL
00331     return db_mysql_save_os_db(maxusercnt, maxusertime, ak, sgl, sql, szl);
00332 #endif
00333 
00334     return 0;
00335 }
00336 
00337 /*************************************************************************/
00338 
00339 int rdb_save_news(NewsItem * ni)
00340 {
00341 
00342 #ifdef USE_MYSQL
00343     return db_mysql_save_news(ni);
00344 #endif
00345 
00346     return 0;
00347 }
00348 
00349 /*************************************************************************/
00350 
00351 int rdb_load_bs_dbase(void)
00352 {
00353 
00354 #ifdef USE_MYSQL
00355     return db_mysql_load_bs_dbase();
00356 #endif
00357 
00358     return 0;
00359 }
00360 
00361 /*************************************************************************/
00362 
00363 int rdb_load_hs_dbase(void)
00364 {
00365 
00366 #ifdef USE_MYSQL
00367     return db_mysql_load_hs_dbase();
00368 #endif
00369 
00370     return 0;
00371 }
00372 
00373 /*************************************************************************/
00374 
00375 int rdb_load_ns_dbase(void)
00376 {
00377 
00378 #ifdef USE_MYSQL
00379     return db_mysql_load_ns_dbase();
00380 #endif
00381 
00382     return 0;
00383 }
00384 
00385 /*************************************************************************/
00386 
00387 int rdb_load_news(void)
00388 {
00389 
00390 #ifdef USE_MYSQL
00391     return db_mysql_load_news();
00392 #endif
00393 
00394     return 0;
00395 }
00396 
00397 /*************************************************************************/
00398 
00399 int rdb_load_exceptions(void)
00400 {
00401 
00402 #ifdef USE_MYSQL
00403     return db_mysql_load_exceptions();
00404 #endif
00405 
00406     return 0;
00407 }
00408 
00409 /*************************************************************************/
00410 
00411 int rdb_load_cs_dbase(void)
00412 {
00413 
00414 #ifdef USE_MYSQL
00415     return db_mysql_load_cs_dbase();
00416 #endif
00417 
00418     return 0;
00419 }
00420 
00421 /*************************************************************************/
00422 
00423 int rdb_load_os_dbase(void)
00424 {
00425 
00426 #ifdef USE_MYSQL
00427     return db_mysql_load_os_dbase();
00428 #endif
00429 
00430     return 0;
00431 }
00432 
00433 /*************************************************************************/
00434 
00435 int rdb_load_ns_req_dbase(void)
00436 {
00437 
00438 #ifdef USE_MYSQL
00439     return db_mysql_load_ns_req_dbase();
00440 #endif
00441 
00442     return 0;
00443 }
00444 
00445 /*************************************************************************/
00446 
00447 #define LOAD_DBASE(num, name, func) {\
00448         if (!func) {\
00449                 alog("RDB unable to load %s database (%d/8) !!!", name, num);\
00450                 return 0;\
00451         }\
00452         if (debug)\
00453                 alog("debug: RDB Loaded %s DataBase (%d/8)", name, num);\
00454 }
00455 
00456 int rdb_load_dbases(void)
00457 {
00458     if (!skeleton) {
00459         LOAD_DBASE(1, "NickServ", rdb_load_ns_dbase());
00460 
00461         if (s_HostServ) {
00462             LOAD_DBASE(2, "HostServ", rdb_load_hs_dbase());
00463         }
00464 
00465         if (s_BotServ) {
00466             LOAD_DBASE(3, "BotServ", rdb_load_bs_dbase());
00467         }
00468 
00469         LOAD_DBASE(4, "ChanServ", rdb_load_cs_dbase());
00470     }
00471 
00472     LOAD_DBASE(5, "OperServ", rdb_load_os_dbase());
00473     LOAD_DBASE(6, "News", rdb_load_news());
00474     LOAD_DBASE(7, "Exception", rdb_load_exceptions());
00475 
00476     if (PreNickDBName) {
00477         LOAD_DBASE(8, "PreNick", rdb_load_ns_req_dbase());
00478     } else if (debug) {
00479         alog("debug: RDB No need to load PreNickDB (8/8)");
00480     }
00481 
00482     alog("RDB: All DataBases loaded.");
00483 
00484     return 0;
00485 }
00486 
00487 /*************************************************************************/
00488 
00489 int rdb_save_exceptions(Exception * e)
00490 {
00491 
00492 #ifdef USE_MYSQL
00493     return db_mysql_save_exceptions(e);
00494 #endif
00495 
00496     return 0;
00497 }
00498 
00499 /* EOF */

Generated on Sun Oct 5 09:06:58 2008 for Anope by  doxygen 1.5.7.1