Exemple #1
0
void db_checkemptychan(int chanid)
{
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
#endif

    SET_SEGV_LOCATION();

    if (!denora->do_sql) {
        return;
    }
    rdb_query(QUERY_HIGH, "SELECT chanid FROM %s WHERE chanid=%d",
              IsOnTable, chanid);
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
    if (mysql_res) {
        SET_SEGV_LOCATION();
        if (!mysql_num_rows(mysql_res)) {
            rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chanid=%d",
                      ChanTable, chanid);
        }
        SET_SEGV_LOCATION();
        mysql_free_result(mysql_res);
    }
#endif
}
Exemple #2
0
void db_removenick(char *nick, char *reason)
{
    char *sqlreason;
    int nickid = db_getnick(nick);

    SET_SEGV_LOCATION();

    if (!denora->do_sql) {
        return;
    }

    if (nickid == 0) {
        alog(LOG_DEBUG, "nickid 0");
        return;
    }
    SET_SEGV_LOCATION();

    db_removefromchans(nickid);
    if (UserCacheTime) {
        sqlreason = rdb_escape(reason);
        rdb_query(QUERY_LOW,
                  "UPDATE %s SET online=\'N\', lastquit=NOW(), lastquitmsg=\'%s\', servid=0 WHERE nickid=%d",
                  UserTable, sqlreason, nickid);
        if (sqlreason) {
            free(sqlreason);
        }
    } else {
        rdb_query(QUERY_LOW, "DELETE FROM %s WHERE nickid=%d",
                  UserTable, nickid);
    }


    SET_SEGV_LOCATION();
}
Exemple #3
0
int chanstats_daily(const char *name)
{
    if (!denora->do_sql) {
        return MOD_CONT;
    }
    if (!name) {
        return MOD_CONT;
    }
    SET_SEGV_LOCATION();
    alog(LOG_NORMAL, langstr(ALOG_RESET_DAILY));
    rdb_query
        (QUERY_LOW,
         "UPDATE %s SET letters=0, words=0, line=0, actions=0, smileys=0, "
         "kicks=0, modes=0, topics=0, wasted=0, "
         "time0=0, time1=0, time2=0, time3=0, time4=0, time5=0, time6=0, time7=0, "
         "time8=0, time9=0, time10=0, time11=0, time12=0, time13=0, time14=0, "
         "time15=0, time16=0, time17=0, time18=0, time19=0, time20=0, time21=0, "
         "time22=0, time23=0  WHERE type=1;", UStatsTable);
    rdb_query(QUERY_LOW,
              "UPDATE %s SET letters=0, words=0, line=0, actions=0, smileys=0, "
              "kicks=0, modes=0, topics=0, "
              "time0=0, time1=0, time2=0, time3=0, time4=0, time5=0, time6=0, time7=0, "
              "time8=0, time9=0, time10=0, time11=0, time12=0, time13=0, time14=0, "
              "time15=0, time16=0, time17=0, time18=0, time19=0, time20=0, time21=0, "
              "time22=0, time23=0  WHERE type=1;", CStatsTable);
    return MOD_CONT;
}
Exemple #4
0
/* check if servs > servs_max */
void do_checkservsmax()
{
    int diff1 = 0;

    SET_SEGV_LOCATION();

    if (stats->servers > stats->servers_max) {
        stats->servers_max = stats->servers;
        stats->servers_max_time = time(NULL);
        diff1 = 1;
    }
    if (!stats->servers_max_time) {
        stats->servers_max_time = time(NULL);
        diff1 = 1;
    }
    SET_SEGV_LOCATION();

    if (stats->servers > stats->daily_servers) {
        stats->daily_servers++;
        stats->daily_servers_time = time(NULL);
    }
    if (denora->do_sql) {
        rdb_query(QUERY_LOW,
                  "UPDATE %s SET val=%d, time=%ld WHERE type='servers'",
                  CurrentTable, stats->servers, time(NULL));
        if (diff1) {
            rdb_query
                (QUERY_LOW,
                 "UPDATE %s SET val=%d, time=FROM_UNIXTIME(%ld) WHERE type='servers'",
                 MaxValueTable, stats->servers_max,
                 (long int) stats->servers_max_time);
        }
    }
}
Exemple #5
0
/* check if chans > chans_max */
void do_checkchansmax()
{
    int diff1 = 0;

    if (stats->chans > stats->chans_max) {
        stats->chans_max = stats->chans;
        stats->chans_max_time = time(NULL);
        diff1 = 1;
    }
    if (!stats->chans_max_time) {
        stats->chans_max_time = time(NULL);
        diff1 = 1;
    }
    SET_SEGV_LOCATION();

    if (stats->chans > stats->daily_chans) {
        stats->daily_chans++;
        stats->daily_chans_time = time(NULL);
    }
    rdb_query(QUERY_LOW,
              "UPDATE %s SET val=%d, time=%ld WHERE type='chans'",
              CurrentTable, stats->chans, time(NULL));
    if (diff1) {
        rdb_query
            (QUERY_LOW,
             "UPDATE %s SET val=%d, time=FROM_UNIXTIME(%ld) WHERE type='channels'",
             MaxValueTable, stats->chans_max,
             (long int) stats->chans_max_time);
    }
}
Exemple #6
0
int chanstats_weekly(const char *name)
{
    if (!denora->do_sql) {
        return MOD_CONT;
    }
    if (!name) {
        return MOD_CONT;
    }
    SET_SEGV_LOCATION();
    alog(LOG_NORMAL, langstr(ALOG_RESETTING_WEEKLY));
    rdb_query
        (QUERY_LOW,
         "UPDATE %s SET letters=0, words=0, line=0, actions=0, smileys=0, "
         "kicks=0, modes=0, topics=0, wasted=0, "
         "time0=0, time1=0, time2=0, time3=0, time4=0, time5=0, time6=0, time7=0, "
         "time8=0, time9=0, time10=0, time11=0, time12=0, time13=0, time14=0, "
         "time15=0, time16=0, time17=0, time18=0, time19=0, time20=0, time21=0, "
         "time22=0, time23=0  WHERE type=2;", UStatsTable);
    rdb_query(QUERY_LOW,
              "UPDATE %s SET letters=0, words=0, line=0, actions=0, smileys=0, "
              "kicks=0, modes=0, topics=0, "
              "time0=0, time1=0, time2=0, time3=0, time4=0, time5=0, time6=0, time7=0, "
              "time8=0, time9=0, time10=0, time11=0, time12=0, time13=0, time14=0, "
              "time15=0, time16=0, time17=0, time18=0, time19=0, time20=0, time21=0, "
              "time22=0, time23=0  WHERE type=2;", CStatsTable);
    rdb_query(QUERY_LOW,
              "DELETE %s.*,%s.* FROM %s,%s WHERE %s.uname = %s.uname AND %s.lastspoke < %i AND %s.ignore = 'N';",
              UStatsTable, AliasesTable, UStatsTable, AliasesTable,
              UStatsTable, AliasesTable, UStatsTable,
              (time(NULL) - ClearInActive), AliasesTable);
    return MOD_CONT;
}
Exemple #7
0
int chans_hourly(const char *name)
{
    static struct tm mytime;
    time_t ts;
    int year;
    int month;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
#endif

    ts = time(NULL);

#ifdef _WIN32
    localtime_s(&mytime, &ts);
#else
    mytime = *localtime(&ts);
#endif

    year = 1900 + mytime.tm_year;
    month = 1 + mytime.tm_mon;

    if (name) {
        alog(LOG_DEBUG, "Executing for %s", name);
    }

    if (!denora->do_sql) {
        return MOD_CONT;
    }

    rdb_query(QUERY_HIGH,
              "SELECT id FROM %s WHERE day=%d and month=%d and year=%d",
              ChanStatsTable, mytime.tm_mday, month, year);
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
    if (mysql_res) {
        if (mysql_num_rows(mysql_res) > 0) {
            rdb_query
                (QUERY_LOW,
                 "UPDATE %s SET time_%d=%d WHERE day=%d and month=%d and year=%d",
                 ChanStatsTable, mytime.tm_hour, stats->chans,
                 mytime.tm_mday, month, year);
        } else {
            rdb_query
                (QUERY_LOW,
                 "INSERT INTO %s (day, month, year, time_%d) VALUES (%d, %d, %d, %d)",
                 ChanStatsTable, mytime.tm_hour, mytime.tm_mday, month,
                 year, stats->chans);
        }
        mysql_free_result(mysql_res);
    }
    SET_SEGV_LOCATION();
#endif
    SET_SEGV_LOCATION();
    return MOD_CONT;
}
Exemple #8
0
/* chan is created if not exists */
int db_getchancreate(char *chan)
{
    int res = -1;
    Channel *c;
    char *channel;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
#endif

    SET_SEGV_LOCATION();
    strtolwr(chan);

    c = findchan(chan);

    if (c) {
        if (c->sqlid) {
            return c->sqlid;
        } else {
            channel = sstrdup(c->sqlchan);
        }
    } else {
        channel = rdb_escape(chan);
    }


    if (!denora->do_sql) {
        return -1;
    }
    strtolwr(channel);
    rdb_query(QUERY_HIGH, "SELECT chanid FROM %s WHERE channel=\'%s\'",
              ChanTable, channel);
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
    if (mysql_res) {
        if (mysql_num_rows(mysql_res))
            res = atoi(*mysql_fetch_row(mysql_res));
        mysql_free_result(mysql_res);
    }
#endif
    SET_SEGV_LOCATION();
    if (res == -1) {
        rdb_query(QUERY_HIGH, "INSERT INTO %s (channel) VALUES (\'%s\')",
                  ChanTable, channel);
        res = rdb_insertid();
    }
    SET_SEGV_LOCATION();
    if (c && res) {
        c->sqlid = res;
    }
    free(channel);
    return res;
}
Exemple #9
0
/**
 * Handle AWAY messages
 *
 * @param source is the nick of the person whom is now away
 * @param msg is the text of the away message
 *
 * @return always returns MOD_CONT
 */
int m_away(char *source, char *msg)
{
    User *u;

    if (!source) {
        return MOD_CONT;
    }
    u = user_find(source);
    if (!u) {
        return MOD_CONT;
    }

    SET_SEGV_LOCATION();

    if (msg) {
        stats->away++;
        u->isaway = 1;
        u->awaymsg = sstrdup(msg);
    } else {
        stats->away--;
        u->isaway = 0;
        u->awaymsg = NULL;
    }
    if (denora->do_sql) {
        rdb_query
            (QUERY_LOW,
             "UPDATE %s SET away=\'%s\', awaymsg=\'%s\' WHERE nickid=%d",
             UserTable, (u->isaway ? (char *) "Y" : (char *) "N"),
             rdb_escape(u->awaymsg), db_getnick(u->sqlnick));
    }
    return MOD_CONT;
}
Exemple #10
0
/* -1 if server not found, servid else */
int db_checkserver_online(char *serv)
{
    int servid = 0;
    Server *s;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
#endif

    s = server_find(serv);
    if (s && s->sqlid) {
        return s->sqlid;
    }

    SET_SEGV_LOCATION();

    if (!denora->do_sql) {
        return -1;
    }

    rdb_query(QUERY_HIGH,
              "SELECT servid FROM %s WHERE server=\'%s\' and online=\'Y\'",
              ServerTable, serv);
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
    if (mysql_res) {
        SET_SEGV_LOCATION();
        mysql_free_result(mysql_res);
        return 1;
    }
#endif
    return servid;
}
Exemple #11
0
int db_getcurrent_chans(void)
{
    int retcode = 0;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
#endif

    if (!denora->do_sql) {
        return 0;
    }
    SET_SEGV_LOCATION();

    rdb_query(QUERY_HIGH, "SELECT COUNT(*) FROM %s WHERE type=\'chans\'",
              CurrentTable);
    SET_SEGV_LOCATION();
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
    if (mysql_res) {
        if (mysql_num_rows(mysql_res)) {
            retcode = atoi(*mysql_fetch_row(mysql_res));
        } else {
            retcode = -1;
        }
        SET_SEGV_LOCATION();
        mysql_free_result(mysql_res);
    }
#endif
    return retcode;
}
Exemple #12
0
/* chan should be db_escape'd before call */
int db_getchannel_users(char *chan)
{
    int res = 0;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
#endif

    SET_SEGV_LOCATION();
    strtolwr(chan);

    if (!denora->do_sql) {
        return -1;
    }
    SET_SEGV_LOCATION();

    rdb_query(QUERY_HIGH,
              "SELECT currentusers FROM %s WHERE channel=\'%s\'",
              ChanTable, chan);
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
    SET_SEGV_LOCATION();
    if (mysql_res) {
        if (mysql_num_rows(mysql_res)) {
            res = strtol(*mysql_fetch_row(mysql_res), NULL, 10);
        } else {
            alog(LOG_DEBUG,
                 "debug: unable to find the requested channel %s", chan);
        }
        SET_SEGV_LOCATION();
        mysql_free_result(mysql_res);
    }
#endif
    return res;
}
Exemple #13
0
char *db_getchannel_byid(int chanid)
{
    char *res = NULL;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
    MYSQL_ROW row;
#endif

    if (!denora->do_sql) {
        return NULL;
    }
    SET_SEGV_LOCATION();

    rdb_query(QUERY_HIGH, "SELECT channel FROM %s WHERE chanid=%d",
              ChanTable, chanid);
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
    if (mysql_res) {
        if (!mysql_num_rows(mysql_res)) {
            alog(LOG_NONEXISTANT, "channel not found ! %d", chanid);
        } else {
            row = mysql_fetch_row(mysql_res);
            res = rdb_escape(row[0]);
        }
        SET_SEGV_LOCATION();
        mysql_free_result(mysql_res);
    }
#endif
    return res;
}
Exemple #14
0
int db_getservfromnick(char *nick)
{
    int res = 0;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
#endif

    if (!denora->do_sql) {
        return -1;
    }
    SET_SEGV_LOCATION();

    rdb_query(QUERY_HIGH, "SELECT servid FROM %s WHERE nick=\'%s\'",
              UserTable, nick);
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
    if (mysql_res) {
        if (mysql_num_rows(mysql_res)) {
            mysql_row = mysql_fetch_row(mysql_res);
            res = strtol(mysql_row[0], NULL, 10);
        } else {
            alog(LOG_NONEXISTANT, "nickname not found ! %s", nick);
        }
        SET_SEGV_LOCATION();
        mysql_free_result(mysql_res);
    }
#endif
    return res;
}
Exemple #15
0
int denora_event_push(char *source, int ac, char **av)
{
/* Thanks to w00t from the inspircd team for helping me to write this function
 * debug: Received: :rock.musichat.net PUSH TestBOT ::rock.musichat.net 242 TestBOT :Server up 1 days, 07:47:54
 */
    Server *s;
    char *num;
    char buf[NET_BUFSIZE];

    if (denora->protocoldebug) {
        protocol_debug(source, ac, av);
    }

    num = myStrGetToken(av[1], ' ', 1);
    av[1] = myStrGetTokenRemainder(av[1], ' ', 3);

    if (!num || !av[1]) {
        alog(LOG_ERROR,
             "ERROR: Something wicked while handling the PUSH message (truncated message)");
        return MOD_CONT;
    }

    if (!strcmp(num, "375")) {
        rdb_query(QUERY_LOW, "UPDATE %s SET motd=\'\' WHERE server=\'%s\'",
                  ServerTable, source);
    } else if (!strcmp(num, "372")) {
        s = server_find(source);
        if (!s) {
            return MOD_CONT;
        }
        av[1]++;
        if (ac >= 2) {
            if (s->motd) {
                ircsnprintf(buf, NET_BUFSIZE - 1, "%s\n\r%s", s->motd,
                            av[1]);
                free(s->motd);
                s->motd = sstrdup(buf);
            } else {
                s->motd = sstrdup(av[1]);
            }
        }
    } else if (!strcmp(num, "376")) {
        s = server_find(source);
        if (!s) {
            return MOD_CONT;
        }
        sql_motd_store(s);
    } else if (!strcmp(num, "242")) {
        av[1]++;
        sql_do_uptime(source, av[1]);
    } else if (!strcmp(num, "248")) {
        av[2] = myStrGetTokenRemainder(av[1], ' ', 1);
        av[1] = myStrGetToken(av[1], ' ', 1);   /* possible memleak at this location */
        sql_uline(av[2]);
    }
    return MOD_CONT;
}
Exemple #16
0
void del_current_user(Server * s)
{
    SET_SEGV_LOCATION();
    if (!s) {
        return;
    }
    s->ss->currentusers--;
    stats->users--;
    SET_SEGV_LOCATION();

    if (denora->do_sql) {
        rdb_query(QUERY_LOW,
                  "UPDATE %s SET val=%d, time=%ld WHERE type='users'",
                  CurrentTable, stats->users, time(NULL));
        rdb_query(QUERY_LOW,
                  "UPDATE %s SET currentusers=%d WHERE server='%s'",
                  ServerTable, s->ss->currentusers, s->name);
    }
}
Exemple #17
0
/**
 * Process numeric 375 messages
 *
 * @param source is the server that sent the message
 * @param ac is the array count
 * @param av is the array
 *
 * @return return is always MOD_CONT
 *
 */
int denora_event_375(char *source, int ac, char **av)
{
    SET_SEGV_LOCATION();
    if (denora->protocoldebug) {
        protocol_debug(source, ac, av);
    }
    rdb_query(QUERY_LOW, "UPDATE %s SET motd=\'\' WHERE server=\'%s\'",
              ServerTable, source);
    return MOD_CONT;
}
Exemple #18
0
int db_getlusers(int type)
{
    int retcode = 0;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
#endif

    if (!denora->do_sql) {
        return 0;
    }
    SET_SEGV_LOCATION();

    switch (type) {
    case LUSERS_USERS:
        rdb_query(QUERY_HIGH,
                  "SELECT COUNT(*) FROM %s WHERE mode_li=\'N\'",
                  UserTable);
        break;
    case LUSERS_USERSINV:
        rdb_query(QUERY_HIGH,
                  "SELECT COUNT(*) FROM %s WHERE mode_li=\'Y\'",
                  UserTable);
        break;
    case LUSERS_OPERS:
        rdb_query(QUERY_HIGH,
                  "SELECT COUNT(*) FROM %s WHERE mode_lo=\'Y\'",
                  UserTable);
        break;
    case LUSERS_CHAN:
        rdb_query(QUERY_HIGH, "SELECT COUNT(*) FROM %s", ChanTable);
        break;
    case LUSERS_SERV:
        rdb_query(QUERY_HIGH, "SELECT COUNT(*) FROM %s", ServerTable);
        break;
    case LUSERS_USERSGLOB:
        rdb_query(QUERY_HIGH, "SELECT COUNT(*) FROM %s", UserTable);
        break;
    case LUSERS_USERSMAX:
        rdb_query(QUERY_HIGH, "SELECT val FROM %s WHERE type='users'",
                  MaxValueTable);
        break;
    }
    SET_SEGV_LOCATION();
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
    if (mysql_res) {
        if (mysql_num_rows(mysql_res)) {
            retcode = atoi(*mysql_fetch_row(mysql_res));
        } else {
            retcode = -1;
        }
        SET_SEGV_LOCATION();
        mysql_free_result(mysql_res);
    }
#endif
    return retcode;
}
Exemple #19
0
void del_oper_count(User * u)
{
    SET_SEGV_LOCATION();

    stats->opers--;
    if (u && u->server && u->server->ss) {
        u->server->ss->opers--;
        rdb_query
            (QUERY_LOW,
             "UPDATE %s SET opers=%d, maxopers=%ld, maxopertime=%ld WHERE server='%s'",
             ServerTable, u->server->ss->opers, u->server->ss->maxopers,
             (long int) u->server->ss->maxopertime, u->server->name);
    }

    SET_SEGV_LOCATION();

    rdb_query(QUERY_LOW,
              "UPDATE %s SET val=%d, time=%ld WHERE type='opers'",
              CurrentTable, stats->opers, time(NULL));
}
Exemple #20
0
void db_removefromchans(int nickid)
{
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
    char **res;
    int chanid;
#endif

    SET_SEGV_LOCATION();

    if (!denora->do_sql) {
        return;
    }

    rdb_query
        (QUERY_HIGH,
         "SELECT %s.chanid, channel FROM %s, %s WHERE nickid=%d AND %s.chanid = %s.chanid",
         IsOnTable, IsOnTable, ChanTable, nickid, ChanTable, IsOnTable);
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
#endif
    rdb_query(QUERY_LOW, "DELETE FROM %s WHERE nickid=%d", IsOnTable,
              nickid);
    SET_SEGV_LOCATION();
#ifdef USE_MYSQL
    if (mysql_res) {
        while ((res = mysql_fetch_row(mysql_res))) {
            char *chan = rdb_escape(res[1]);
            chanid = db_getchannel(chan);
            rdb_query(QUERY_LOW,
                      "UPDATE %s SET currentusers=currentusers-1 WHERE chanid=%d",
                      ChanTable, chanid);
            if (!ChanHasMode(chan, ircd->persist_char))
                db_checkemptychan(atoi(res[0]));
            free(chan);
        }
        SET_SEGV_LOCATION();
        mysql_free_result(mysql_res);
    }
#endif
}
Exemple #21
0
/* cleanup the server table, removing old entries */
void db_cleanserver()
{
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
#endif
    int curtime = time(NULL);

    SET_SEGV_LOCATION();

    if (!denora->do_sql) {
        return;
    }

    if (ServerLastClean == -1) {
        ServerLastClean = curtime;
    }
    SET_SEGV_LOCATION();
    if (curtime > (ServerLastClean + ServerCleanFreq)) {
        ServerLastClean = curtime;
        rdb_query
            (QUERY_HIGH,
             "SELECT server FROM %s WHERE online=\'N\' AND lastsplit<FROM_UNIXTIME(%d)",
             ServerTable, curtime - ServerCacheTime);
#ifdef USE_MYSQL
        mysql_res = mysql_store_result(mysql);
        if (mysql_num_rows(mysql_res)) {
            mysql_free_result(mysql_res);
            rdb_query
                (QUERY_LOW,
                 "DELETE FROM %s WHERE online=\'N\' AND lastsplit<FROM_UNIXTIME(%d)",
                 ServerTable, curtime - ServerCacheTime);
        } else {
            if (mysql_res) {
                mysql_free_result(mysql_res);
            }
        }
#endif
        SET_SEGV_LOCATION();
    }
}
Exemple #22
0
/* chan should be db_escape'd before call */
int db_getchannel(char *chan)
{
    int res = 0;
    Channel *c;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
#endif

    if (!chan)
        return -1;

    strtolwr(chan);
    SET_SEGV_LOCATION();

    c = findchan(chan);
    if (c && c->sqlid) {
        return c->sqlid;
    }

    if (!denora->do_sql) {
        return -1;
    }

    rdb_query(QUERY_HIGH, "SELECT chanid FROM %s WHERE channel=\'%s\'",
              ChanTable, chan);
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
    if (mysql_res) {
        if (mysql_num_rows(mysql_res)) {
            mysql_row = mysql_fetch_row(mysql_res);
            res = strtol(mysql_row[0], NULL, 10);
        } else {
            alog(LOG_NONEXISTANT, "channel not found ! %s", chan);
        }
        SET_SEGV_LOCATION();
        mysql_free_result(mysql_res);
    }
#endif
    return res;
}
Exemple #23
0
/* serv should be db_escape'd before call */
int db_getserver(char *serv)
{
    Server *s;
    int res = 0;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
#endif

    SET_SEGV_LOCATION();

    s = server_find(serv);
    if (s && s->sqlid) {
        return s->sqlid;
    }

    if (!denora->do_sql) {
        return res;
    }

    if (!serv) {
        return res;
    }

    rdb_query(QUERY_HIGH, "SELECT servid FROM %s WHERE server=\'%s\'",
              ServerTable, serv);
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
    if (mysql_res) {
        if (mysql_num_rows(mysql_res)) {
            mysql_row = mysql_fetch_row(mysql_res);
            res = strtol(mysql_row[0], NULL, 10);
        }
        SET_SEGV_LOCATION();
        mysql_free_result(mysql_res);
    }
#endif
    return res;
}
Exemple #24
0
/**
 * Handle KILL messages
 *
 * @param source is the server or nick that send the message
 * @param nick is the user name that was killed
 * @param msg is the text of the kill message
 *
 * @return void - no returend value
 */
void m_kill(char *source, char *nick, char *msg)
{
    User *u;
    ServStats *s;
    int id;

    if ((u = user_find(source))) {
        if ((s = findserverstats(u->server->name))) {
            s->ircopskills++;
        }
        send_event(EVENT_GLOBAL_KILL, 3, source, nick, msg);
    } else if ((s = findserverstats(source))) {
        s->serverkills++;
        send_event(EVENT_SERVER_KILL, 3, source, nick, msg);
    }
    do_kill(nick, msg);
    if (denora->do_sql) {
        nick = rdb_escape(nick);
        db_removenick(nick, msg);
        if (UserCacheTime) {
            db_cleanuser();
        }
        free(nick);
    }
    if (s && denora->do_sql) {
        id = db_getserver(s->name);
        if (id) {
            rdb_query
                (QUERY_LOW,
                 "UPDATE %s SET ircopskills=%d, serverkills=%ld WHERE servid=%d",
                 ServerTable, s->ircopskills, s->serverkills, id);
        }
    }
    if (nickIsServices(nick)) {
        introduce_user(nick);
    }
}
Exemple #25
0
/* nick should be db_escape'd before call */
int db_getnick_unsure(char *nick)
{
    User *u;
    int res = 0;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
#endif

    SET_SEGV_LOCATION();

    u = user_find(nick);
    if (u && u->sqlid) {
        return u->sqlid;
    }

    if (!denora->do_sql) {
        return -1;
    }

    rdb_query(QUERY_HIGH, "SELECT nickid FROM %s WHERE nick=\'%s\'",
              UserTable, nick);
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
    if (mysql_res) {
        if (mysql_num_rows(mysql_res)) {
            mysql_row = mysql_fetch_row(mysql_res);
            res = strtol(mysql_row[0], NULL, 10);
        } else {
            res = -1;
        }
        SET_SEGV_LOCATION();
        mysql_free_result(mysql_res);
    }
#endif
    return res;
}
Exemple #26
0
int chanstats_month(const char *name)
{
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
    ChannelStats *cs;
    char *chan_;
#endif
    time_t tbuf;

    if (!denora->do_sql) {
        return MOD_CONT;
    }
    if (!name) {
        return MOD_CONT;
    }
    SET_SEGV_LOCATION();
    alog(LOG_NORMAL, langstr(ALOG_RESETTING_MONTHLY));
    rdb_query
        (QUERY_LOW,
         "UPDATE %s SET letters=0, words=0, line=0, actions=0, smileys=0, "
         "kicks=0, modes=0, topics=0, wasted=0, "
         "time0=0, time1=0, time2=0, time3=0, time4=0, time5=0, time6=0, time7=0, "
         "time8=0, time9=0, time10=0, time11=0, time12=0, time13=0, time14=0, "
         "time15=0, time16=0, time17=0, time18=0, time19=0, time20=0, time21=0, "
         "time22=0, time23=0 WHERE type=3;", UStatsTable);
    rdb_query(QUERY_LOW,
              "UPDATE %s SET letters=0, words=0, line=0, actions=0, smileys=0, "
              "kicks=0, modes=0, topics=0, "
              "time0=0, time1=0, time2=0, time3=0, time4=0, time5=0, time6=0, time7=0, "
              "time8=0, time9=0, time10=0, time11=0, time12=0, time13=0, time14=0, "
              "time15=0, time16=0, time17=0, time18=0, time19=0, time20=0, time21=0, "
              "time22=0, time23=0 WHERE type=3;", CStatsTable);

    /* request 109 -  auto-delete channel after not used for 1 month */

    tbuf = (time(NULL) - ClearChanInActive);
    rdb_query
        (QUERY_HIGH,
         "SELECT chan FROM %s WHERE (lastspoke > 0) AND (lastspoke < %i);",
         CStatsTable, tbuf);
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
    if (mysql_num_rows(mysql_res) > 0) {
        SET_SEGV_LOCATION();
        while ((mysql_row = mysql_fetch_row(mysql_res)) != NULL) {
            if ((cs = find_cs(mysql_row[0]))) {
                alog(LOG_DEBUG,
                     "chanstats monthly: channel %s is expired, statserv will leave this chan, all stats are deleted");
                del_cs(cs);     /* make statserv part the chan */
                chan_ = rdb_escape(mysql_row[0]);
                rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'",
                          CStatsTable, chan_);
                rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'",
                          UStatsTable, chan_);
                free(chan_);
                if (LogChannel) {
                    if (stricmp(LogChannel, mysql_row[0])) {
                        denora_cmd_part(s_StatServ, mysql_row[0],
                                        getstring(NULL,
                                                  STATS_CHANSTATS_PART),
                                        mysql_row[0]);

                    }
                }
            }
        }
        save_cs_db();
    }
#endif
    return MOD_CONT;
}
Exemple #27
0
void db_removenick_nt(char *nick, char *reason)
{
    char *sqlreason;
    int nickid = db_getnick(nick);

    User *u;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
    MYSQL_RES *mysql_res2;
#endif
    char *username, *host, *queryhost;
    char *newnick;
    char *olduser = (char *) "";
    char *newuser = (char *) "";

    u = user_find(nick);


    SET_SEGV_LOCATION();

    if (!denora->do_sql) {
        return;
    }

    if (nickid == 0) {
        alog(LOG_DEBUG, "nickid 0");
        return;
    }
    SET_SEGV_LOCATION();

    db_removefromchans(nickid);
    if (UserCacheTime) {
        sqlreason = rdb_escape(reason);
        if (u) {
            username = rdb_escape(u->username);
            host = rdb_escape(u->host);
            queryhost =
                (myNumToken(host, '.') >= 2) ? strchr(host, '.') : host;
            queryhost = StrReverse(queryhost);
            rdb_query(QUERY_HIGH,
                      "SELECT nick FROM %s WHERE username=\'%s\' AND REVERSE(hostname) LIKE \'%s%%\' AND online=\'Y\' AND nick != \'%s\' ORDER BY connecttime DESC",
                      UserTable, username, queryhost, u->sqlnick);
#ifdef USE_MYSQL
            mysql_res = mysql_store_result(mysql);
            if (mysql_res) {
                if (mysql_num_rows(mysql_res) > 0) {
                    /* Getting nickname of user we found */
                    mysql_row = mysql_fetch_row(mysql_res);
                    newnick = rdb_escape(mysql_row[0]);
                    mysql_free_result(mysql_res);

                    /* Deleting user as we got one with a similar mask which is still online */
                    alog(LOG_DEBUG,
                         "db_removenick_nt(%s): There is %s with similar mask online, so we will delete %s.",
                         nick, newnick, nick);
                    rdb_query(QUERY_LOW, "DELETE FROM %s WHERE nickid=%d",
                              UserTable, nickid);

                    /* Getting uname of the old and new users */
                    rdb_query(QUERY_LOW,
                              "SELECT nick, uname FROM %s WHERE nick=\'%s\' OR nick=\'%s\'",
                              AliasesTable, newnick, u->sqlnick);
                    mysql_res2 = mysql_store_result(mysql);
                    if (mysql_res2) {
                        while ((mysql_row =
                                mysql_fetch_row(mysql_res2)) != NULL) {
                            if (stricmp(mysql_row[0], newnick) == 0) {
                                newuser = rdb_escape(mysql_row[1]);
                            }
                            if (stricmp(mysql_row[0], u->sqlnick) == 0) {
                                olduser = rdb_escape(mysql_row[1]);
                            }
                        }
                        mysql_free_result(mysql_res2);
                    }
                    /* Summing old user to new user, if they differ */
                    /*if ((!BadPtr(newuser)) && (!BadPtr(olduser))
                        && (stricmp(newuser, olduser) != 0)) {
                        alog(LOG_DEBUG,
                             "db_removenick_nt(%s): summing old user %s and new user %s.",
                             nick, olduser, newuser);
                        sumuser(u, olduser, newuser);
                        if (olduser) {
                            free(olduser);
                        }
                        if (newuser) {
                            free(newuser);
                        }
                    }*/
                    if (newnick) {
                        free(newnick);
                    }

                } else {
                    mysql_free_result(mysql_res);
                    rdb_query(QUERY_LOW,
                              "UPDATE %s SET online=\'N\', lastquit=NOW(), lastquitmsg=\'%s\', servid=0 WHERE nickid=%d",
                              UserTable, sqlreason, nickid);
                }
            }
            if (username) {
                free(username);
            }
            if (host) {
                free(host);
            }
            SET_SEGV_LOCATION();
#endif
        } else {
            rdb_query(QUERY_LOW,
                      "UPDATE %s SET online=\'N\', lastquit=NOW(), lastquitmsg=\'%s\', servid=0 WHERE nickid=%d",
                      UserTable, sqlreason, nickid);
        }
        if (sqlreason) {
            free(sqlreason);
        }
    } else {
        rdb_query(QUERY_LOW, "DELETE FROM %s WHERE nickid=%d",
                  UserTable, nickid);
    }


    SET_SEGV_LOCATION();
}
Exemple #28
0
/**
 * Handle seen fantasy command.
 * @param argc Argument count
 * @param argv Argument list
 * @return MOD_CONT or MOD_STOP
 **/
int do_fantasy(int argc, char **argv)
{
    User *u;
    char *chan;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
    int i = 1;
#endif
    ChannelStats *cs;

    if (argc < 3) {
        return MOD_CONT;
    }

    if (!denora->do_sql) {
        return MOD_CONT;
    }

    if (stricmp(argv[0], "top10") == 0) {
        u = finduser(argv[1]);
        chan = rdb_escape(argv[2]);
        cs = find_cs(argv[2]);
        rdb_query
            (QUERY_HIGH,
             "SELECT * FROM %s WHERE chan=\'%s\' AND type=0 ORDER BY letters DESC LIMIT 10;",
             UStatsTable, chan);
        free(chan);
#ifdef USE_MYSQL
        mysql_res = mysql_store_result(mysql);
        if (mysql_num_rows(mysql_res) > 0) {
            if (cs->flags & CS_NOTICE) {
                notice_lang(s_StatServ, u, STATS_TOP10_CHANNEL, argv[2]);
            } else {
                denora_cmd_privmsg(s_StatServ, argv[2],
                                   getstring(NULL,
                                             STATS_TOP10_CHANNEL),
                                   argv[2]);
            }
            SET_SEGV_LOCATION();
            while ((mysql_row = mysql_fetch_row(mysql_res)) != NULL) {
                if (cs->flags & CS_NOTICE) {
                    notice_lang(s_StatServ, u, STATS_MESSAGE,
                                i, mysql_row[0], mysql_row[3],
                                mysql_row[4], mysql_row[5],
                                mysql_row[7], mysql_row[6]);
                } else {
                    denora_cmd_privmsg(s_StatServ, argv[2],
                                       getstring(NULL,
                                                 STATS_MESSAGE), i,
                                       mysql_row[0], mysql_row[3],
                                       mysql_row[4], mysql_row[5],
                                       mysql_row[7], mysql_row[6]);
                }
                i++;
            }
        }
        SET_SEGV_LOCATION();
        mysql_free_result(mysql_res);
#endif
    }

    return MOD_CONT;
}
Exemple #29
0
/**
 * Seen
 **/
char *do_seen(User * u, char *target)
{
    char *split1 = NULL;
    char *seenhost = NULL;
    char *seennick = NULL;
    char *seenuname = NULL;
    struct tm tm;
    char buf[255];
    int i;
    MYSQL_RES *mysql_res;
    char *sqltarget;
    char usrchans[1024] = "\0";
    time_t tsnow = time(NULL);
    MYSQL_RES *mysql_res2;
    MYSQL_ROW mysql_row2;
    char cmodep[32] = "\0";
    char cmodes[32] = "\0";
    char cmodeA[32] = "\0";
    char cmodeO[32] = "\0";
    char umodep[32] = "\0";
	char umodeQ[32] = "\0";
	char umodeI[32] = "\0";
    double ctsdiff;
    time_t time0 = time(NULL);
    time_t time1 = time(NULL);
	time_t tt = time(NULL);
    char *message;
	char *uname = NULL;
    message = malloc(1024);

    sqltarget = rdb_escape(rdb_escape(target));
    for (i = 0; sqltarget[i]; i++)
        if (sqltarget[i] == '*')
            sqltarget[i] = '%';
    seenhost = myStrGetToken(sqltarget, '@', 1);
    split1 = myStrGetToken(sqltarget, '@', 0);
    seennick = myStrGetToken(split1, '!', 0);
    seenuname = myStrGetToken(split1, '!', 1);
    if (seenhost == NULL)
        seenhost = (char *) "%";
    if (seennick == NULL)
        seennick = (char *) "%";
    if (seenuname == NULL)
        seenuname = (char *) "%";
    free(sqltarget);
	
	if (!strcmp(seennick, "%")) {
		uname = sstrdup("%");
	} else {	
		rdb_query(QUERY_LOW, "SELECT uname FROM %s WHERE nick LIKE \'%s\' ",
					  AliasesTable, seennick);
		mysql_res = mysql_store_result(mysql);
		if (mysql_res && mysql_num_rows(mysql_res)) {
			mysql_row = mysql_fetch_row(mysql_res);
			uname = rdb_escape(mysql_row[0]);
		}
	}
	
	if (uname) {
		rdb_query(QUERY_LOW,
              "SELECT %s.nickid, %s.nick, %s.hostname, %s.hiddenhostname, %s.username, UNIX_TIMESTAMP(%s.connecttime), %s.away, %s.awaymsg, %s.online, UNIX_TIMESTAMP(%s.lastquit), %s.lastquitmsg FROM %s,%s,%s WHERE %s.uname LIKE \"%s\" AND %s.nick = %s.nick AND %s.username LIKE \"%s\" AND (%s.hostname LIKE \"%s\" OR %s.hiddenhostname LIKE \"%s\") AND %s.server = %s.server AND %s.uline = \"0\" ORDER BY online,lastquit DESC, %s.connecttime ASC LIMIT 1;",
              UserTable, UserTable, UserTable, UserTable, UserTable,
              UserTable, UserTable, UserTable, UserTable, UserTable,
              UserTable, UserTable, ServerTable, AliasesTable,
              AliasesTable, uname, UserTable,
              AliasesTable, UserTable, seenuname, UserTable, seenhost,
              UserTable, seenhost, UserTable, ServerTable, ServerTable, UserTable);
		mysql_res = mysql_store_result(mysql);
	} else {
		rdb_query(QUERY_LOW,
              "SELECT %s.nickid, %s.nick, %s.hostname, %s.hiddenhostname, %s.username, UNIX_TIMESTAMP(%s.connecttime), %s.away, %s.awaymsg, %s.online, UNIX_TIMESTAMP(%s.lastquit), %s.lastquitmsg FROM %s,%s WHERE %s.nick LIKE \"%s\" AND %s.username LIKE \"%s\" AND (%s.hostname LIKE \"%s\" OR %s.hiddenhostname LIKE \"%s\") AND %s.server = %s.server AND %s.uline = \"0\" ORDER BY online,lastquit DESC, %s.connecttime ASC LIMIT 1;",
              UserTable, UserTable, UserTable, UserTable, UserTable,
              UserTable, UserTable, UserTable, UserTable, UserTable,
              UserTable, UserTable, ServerTable, UserTable, seennick,
              UserTable, seenuname, UserTable, seenhost,
              UserTable, seenhost, UserTable, ServerTable, ServerTable, UserTable);
		mysql_res = mysql_store_result(mysql);
	}

    if (mysql_num_rows(mysql_res) > 0) {
        SET_SEGV_LOCATION();
        while ((mysql_row = mysql_fetch_row(mysql_res)) != NULL) {
            double tsdiff;
            if (mysql_row[5] != NULL) { 
                time0 = atoi(mysql_row[5]); /* connect time */
            }
            if (mysql_row[9] != NULL) {   
                time1 = atoi(mysql_row[9]); /* quit time */
            }
            if (strlen(mysql_row[3]) <= 1)
                mysql_row[3] = mysql_row[2];    /* no vhost, so using real host */
            if (stricmp(mysql_row[8], "Y") == 0) {
                if (mysql_row[5] != NULL) {
					tt = atoi(mysql_row[5]);
					tm = *localtime(&tt);
                    strftime(buf, sizeof(buf), "%d.%m %H:%M", &tm);
                    mysql_row[5] = buf;
                }

                /* Display channels the user is in */
                /* check for ircd compatibility: chanmodes +AOsp and usermode +p */
                if (denora_cmode(CMODE_p) == 1)
                    sprintf(cmodep, "AND %s.mode_lp = 'N' ", ChanTable);
                if (denora_cmode(CMODE_s) == 1)
                    sprintf(cmodes, "AND %s.mode_ls = 'N' ", ChanTable);
                if (denora_cmode(CMODE_A) == 1)
                    sprintf(cmodeA, "AND %s.mode_ua = 'N' ", ChanTable);
                if (denora_cmode(CMODE_O) == 1)
                    sprintf(cmodeO, "AND %s.mode_uo = 'N' ", ChanTable);
                if (denora_umode(UMODE_p) == 1)
                    sprintf(umodep, "AND %s.mode_lp = 'N' ", UserTable);
				if (denora_get_ircd() == IRC_INSPIRCD11 || denora_get_ircd() == IRC_INSPIRCD12) {
					if (denora_umode(UMODE_Q) == 1)
						sprintf(umodeQ, "AND %s.mode_uq = 'N' ", UserTable);
					if (denora_umode(UMODE_I) == 1)
						sprintf(umodeI, "AND %s.mode_ui = 'N' ", UserTable);
				}
                rdb_query(QUERY_LOW,
                          "SELECT %s.channel FROM %s,%s,%s WHERE %s.nickid =%s AND %s.chanid = %s.chanid AND %s.nickid = %s.nickid %s%s%s%s%s%s%s ORDER BY %s.channel ASC",
                          ChanTable, ChanTable, UserTable, IsOnTable,
                          IsOnTable, mysql_row[0], ChanTable, IsOnTable,
                          UserTable, IsOnTable, cmodep, cmodes, cmodeA,
                          cmodeO, umodep, umodeQ, umodeI, ChanTable);
                mysql_res2 = mysql_store_result(mysql);
                while ((mysql_row2 = mysql_fetch_row(mysql_res2)) != NULL) {
                    strlcat(usrchans, mysql_row2[0], sizeof(usrchans));
                    strlcat(usrchans, " ", sizeof(usrchans));
                }
                mysql_free_result(mysql_res2);

                ctsdiff = difftime(tsnow, time0);       /* total online time */

                /* Prepare the reply for the user */
                if (stricmp(mysql_row[6], "N") == 0) {
                    if (strlen(usrchans) < 3) {
                        sprintf(message,
                                moduleGetLangString(u, SEEN_ONLINE),
                                mysql_row[1], mysql_row[4], mysql_row[3],
                                get_timestring(u, ctsdiff), mysql_row[5]);
                    } else {
                        sprintf(message,
                                moduleGetLangString(u, SEEN_ONLINEC),
                                mysql_row[1], mysql_row[4], mysql_row[3],
                                get_timestring(u, ctsdiff), mysql_row[5],
                                usrchans);
                    }
                } else {
                    if (strlen(usrchans) < 3) {
                        sprintf(message, moduleGetLangString(u, SEEN_AWAY),
                                mysql_row[1], mysql_row[4], mysql_row[3],
                                get_timestring(u, ctsdiff), mysql_row[5],
                                mysql_row[7]);
                    } else {
                        sprintf(message,
                                moduleGetLangString(u, SEEN_AWAYC),
                                mysql_row[1], mysql_row[4], mysql_row[3],
                                get_timestring(u, ctsdiff), mysql_row[5],
                                mysql_row[7], usrchans);
                    }
                }
            } else {
                double dtsdiff;
                if (mysql_row[9] != NULL && mysql_row[5] != NULL) {
					tt = atoi(mysql_row[9]);
					tm = *localtime(&tt);
                    strftime(buf, sizeof(buf), "%d.%m %H:%M", &tm);
                    mysql_row[9] = buf;
                    dtsdiff = difftime(tsnow, time1);   /* total offline time */
                    tsdiff = difftime(time1, time0);    /* total online time */
                    sprintf(message, moduleGetLangString(u, SEEN_OFFLINE),
                            mysql_row[1], mysql_row[4], mysql_row[3],
                            get_timestring(u, dtsdiff), mysql_row[9],
                            get_timestring(u, tsdiff), mysql_row[10]);
                } else {
                    sprintf(message, moduleGetLangString(u, SEEN_UNKNOWN),
                            mysql_row[1], mysql_row[4], mysql_row[3]);
                }
            }
        }
    } else {
        sprintf(message, moduleGetLangString(u, SEEN_EMPTY), target);
    }
    SET_SEGV_LOCATION();
    mysql_free_result(mysql_res);

    return message;
}
Exemple #30
0
/* -1 if nick not found, nickid else */
int db_checknick_nt(char *nick)
{
    int nickid = -1;
    User *u;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
    MYSQL_RES *mysql_res2;
#endif
    char *username, *host, *queryhost, *olduname;

    SET_SEGV_LOCATION();

    u = user_find(nick);
    if (u && u->sqlid) {
        return u->sqlid;
    }

    if (!denora->do_sql) {
        return -1;
    }

    if (u) {
        username = rdb_escape(u->username);
        host = rdb_escape(u->host);
        queryhost =
            (myNumToken(host, '.') >= 2) ? strchr(host, '.') : host;
        queryhost = StrReverse(queryhost);
        rdb_query(QUERY_HIGH,
                  "SELECT nickid,nick FROM %s WHERE (username=\'%s\' AND REVERSE(hostname) LIKE \'%s%%\' AND online=\'N\') OR nick=\'%s\' ORDER BY connecttime DESC",
                  UserTable, username, queryhost, u->sqlnick);

#ifdef USE_MYSQL
        mysql_res = mysql_store_result(mysql);
        if (mysql_res) {
            if (mysql_num_rows(mysql_res)) {
                mysql_row = mysql_fetch_row(mysql_res);
                nickid = strtol(mysql_row[0], NULL, 10);
                if (stricmp(mysql_row[1], u->sqlnick) != 0) {
                    /* Removing old user to avoid duplicate on update, which will happen shortly */
                    rdb_query(QUERY_HIGH,
                              "DELETE FROM %s WHERE nick=\'%s\' ",
                              UserTable, u->sqlnick);
                    /* Getting uname from alias table with old nick */
                    rdb_query(QUERY_HIGH,
                              "SELECT uname FROM %s WHERE nick=\'%s\' ",
                              AliasesTable, u->sqlnick);
                    mysql_res2 = mysql_store_result(mysql);
                    if (mysql_res2) {
                        if (mysql_num_rows(mysql_res2)) {
                            mysql_row = mysql_fetch_row(mysql_res2);
                            olduname = rdb_escape(mysql_row[0]);
                            /* Adding alias entry with new nick and old uname to avoid creation of new uname */
                            rdb_query(QUERY_HIGH,
                                      "INSERT INTO %s (nick, uname) VALUES (\'%s\', \'%s\') ON DUPLICATE KEY UPDATE uname=\'%s\'",
                                      AliasesTable, u->sqlnick, olduname,
                                      olduname);
                            free(olduname);
                        }
                        mysql_free_result(mysql_res2);
                    }
                }
                mysql_free_result(mysql_res);
            }
            SET_SEGV_LOCATION();
        } else {
            nickid = -1;
        }
        if (username) {
            free(username);
        }
        if (host) {
            free(host);
        }
#endif
        return nickid;
    } else {
        rdb_query(QUERY_HIGH, "SELECT nickid FROM %s WHERE nick=\'%s\'",
                  UserTable, nick);
#ifdef USE_MYSQL
        mysql_res = mysql_store_result(mysql);
        if (mysql_res) {
            if (mysql_num_rows(mysql_res)) {
                mysql_row = mysql_fetch_row(mysql_res);
                nickid = strtol(mysql_row[0], NULL, 10);
            }
            SET_SEGV_LOCATION();
            mysql_free_result(mysql_res);
        } else {
            nickid = -1;
        }
#endif
        return nickid;
    }
}