aboutsummaryrefslogtreecommitdiff
path: root/Maintenance/updatestats.cpp
blob: a19e7d9e4e915d2a7dea1c126f5e5daee71cc916 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include "maintenance.h"

int Maintenance::updateStats()
{
    // result
    int numOfUpdatedStats = 0;

    // get list of gamenames in database
    QString   selectGamenames = "SELECT DISTINCT gamename FROM serverlist";
    QSqlQuery gamenameQuery;
    gamenameQuery.prepare(selectGamenames);
    if ( ! gamenameQuery.exec() )
        return reportQuery(gamenameQuery);

    // update stats for every gamename
    while ( gamenameQuery.next() )
    {
        // get next gamename
        QString gamename = gamenameQuery.value(0).toString();

        // determine beacon and server counts
        QString selectStats = "SELECT COUNT(CASE WHEN f_direct THEN 1 END) AS num_direct, "
                                                                 "count(*) AS num_total "
                              "FROM serverlist "
                              "WHERE gamename = :gamename AND dt_updated > :timestamp";
        QSqlQuery statQuery;
        statQuery.prepare(selectStats);
        statQuery.bindValue(":gamename", gamename);
        statQuery.bindValue(":timestamp", QDateTime::currentDateTime()
                            .addSecs(-_coreObject->Settings.ListenServerSettings.serverttl_s).toSecsSinceEpoch());
        if ( ! statQuery.exec() )
            return reportQuery(statQuery);

        // get values
        int num_direct = -1;
        int num_total  = -1;
        if ( statQuery.next() )
        {
            num_direct = statQuery.value("num_direct").toInt();
            num_total  = statQuery.value("num_total").toInt();
        }

        // write to db
        QString updateStatQuery = "UPDATE gameinfo "
                                  "SET num_direct = :num_direct, num_total = :num_total "
                                  "WHERE gamename = :gamename ";
        statQuery.prepare(updateStatQuery);
        statQuery.bindValue(":num_direct", num_direct);
        statQuery.bindValue(":num_total", num_total);
        statQuery.bindValue(":gamename", gamename);
        if ( ! statQuery.exec() )
            return reportQuery(statQuery);

        // update counter
        numOfUpdatedStats += statQuery.numRowsAffected();
    }

    return numOfUpdatedStats;
}