X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2FDBHelper.c;h=4f3dd757262d0150e93a3966731b163d6712ee92;hb=55831bf424312a6908ca07a904f288fba0919a9a;hp=a55b8c677de27c7ec0f7204df4c9c624b2703172;hpb=55bcc9aad6a4c85d10b47fb8639b4d2255059051;p=NeonServV5.git diff --git a/src/DBHelper.c b/src/DBHelper.c index a55b8c6..4f3dd75 100644 --- a/src/DBHelper.c +++ b/src/DBHelper.c @@ -1,5 +1,5 @@ -/* DBHelper.c - NeonServ v5.2 - * Copyright (C) 2011 Philipp Kreil (pk910) +/* DBHelper.c - NeonServ v5.3 + * Copyright (C) 2011-2012 Philipp Kreil (pk910) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,9 +26,10 @@ #include "HandleInfoHandler.h" void _loadUserSettings(struct UserNode *user) { + SYNCHRONIZE(cache_sync); MYSQL_RES *res; MYSQL_ROW row; - printf_mysql_query("SELECT `user_lang`, `user_reply_privmsg`, `user_god` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); + printf_mysql_query("SELECT `user_lang`, `user_reply_privmsg`, `user_god`, `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); res = mysql_use(); if ((row = mysql_fetch_row(res)) != NULL) { user->language = get_language_by_tag(row[0]); @@ -37,9 +38,12 @@ void _loadUserSettings(struct UserNode *user) { user->flags |= USERFLAG_REPLY_PRIVMSG; if(strcmp(row[2], "0")) user->flags |= USERFLAG_GOD_MODE; + user->user_id = atoi(row[3]); + user->flags |= USERFLAG_HAS_USERID; } else user->language = get_default_language(); user->flags |= USERFLAG_LOADED_SETTINGS; + DESYNCHRONIZE(cache_sync); } int isGodMode(struct UserNode *user) { @@ -54,19 +58,27 @@ int getChannelAccess(struct UserNode *user, struct ChanNode *chan) { MYSQL_RES *res; MYSQL_ROW row; int caccess = 0; - printf_mysql_query("SELECT `user_id`, `user_access`, `user_god` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); - res = mysql_use(); - if ((row = mysql_fetch_row(res)) != NULL) { - printf_mysql_query("SELECT `chanuser_access`, `chanuser_flags` FROM `chanusers` WHERE `chanuser_uid` = '%s' AND `chanuser_cid` = '%d'", row[0], chan->channel_id); + int userid; + if(user->flags & USERFLAG_HAS_USERID) + userid = user->user_id; + else { + printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); res = mysql_use(); if ((row = mysql_fetch_row(res)) != NULL) { - int cflags = atoi(row[1]); - if(!(cflags & DB_CHANUSER_SUSPENDED) && atoi(row[0]) > caccess) - caccess = atoi(row[0]); - } - return caccess; + userid = atoi(row[0]); + user->user_id = userid; + user->flags |= USERFLAG_HAS_USERID; + } else + return 0; } - return 0; + printf_mysql_query("SELECT `chanuser_access`, `chanuser_flags` FROM `chanusers` WHERE `chanuser_uid` = '%d' AND `chanuser_cid` = '%d'", userid, chan->channel_id); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + int cflags = atoi(row[1]); + if(!(cflags & DB_CHANUSER_SUSPENDED) && atoi(row[0]) > caccess) + caccess = atoi(row[0]); + } + return caccess; } char *getChanDefault(char *channel_setting) { @@ -91,10 +103,21 @@ int checkChannelAccess(struct UserNode *user, struct ChanNode *chan, char *chann if(require_access == 0) return 1; if(!(user->flags & USERFLAG_ISAUTHED)) return 0; int caccess = 0; - printf_mysql_query("SELECT `user_id`, `user_access`, `user_god` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); - res = mysql_use(); - if ((row = mysql_fetch_row(res)) != NULL) { - printf_mysql_query("SELECT `chanuser_access`, `chanuser_flags` FROM `chanusers` WHERE `chanuser_uid` = '%s' AND `chanuser_cid` = '%d'", row[0], chan->channel_id); + int userid; + if(user->flags & USERFLAG_HAS_USERID) + userid = user->user_id; + else { + printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + userid = atoi(row[0]); + user->user_id = userid; + user->flags |= USERFLAG_HAS_USERID; + } else + userid = -1; + } + if(userid > -1) { + printf_mysql_query("SELECT `chanuser_access`, `chanuser_flags` FROM `chanusers` WHERE `chanuser_uid` = '%d' AND `chanuser_cid` = '%d'", userid, chan->channel_id); res = mysql_use(); if ((row = mysql_fetch_row(res)) != NULL) { int cflags = atoi(row[1]); @@ -108,6 +131,7 @@ int checkChannelAccess(struct UserNode *user, struct ChanNode *chan, char *chann } void _loadChannelSettings(struct ChanNode *chan) { + SYNCHRONIZE(cache_sync); MYSQL_RES *res; MYSQL_ROW row; printf_mysql_query("SELECT `channel_id` FROM `channels` WHERE `channel_name` = '%s'", escape_string(chan->name)); @@ -117,6 +141,7 @@ void _loadChannelSettings(struct ChanNode *chan) { chan->channel_id = atoi(row[0]); } chan->flags |= CHANFLAG_REQUESTED_CHANINFO; + DESYNCHRONIZE(cache_sync); } //TODO: fix performance: we should cache the user access @@ -246,6 +271,8 @@ static int event_user_registered(struct UserNode *old_user, struct UserNode *new strcpy(newauth, new_user->host); *p = '.'; } + if(!stricmp(oldauth, newauth)) + return 0; //check if we know this user; then check the new auth MYSQL_RES *res; MYSQL_ROW row;