1 #include "fetch_group.h"
3 FetchGroup::FetchGroup(unsigned tournament, unsigned round, unsigned parallel, Group *group) :
4 tournament(tournament), round(round), parallel(parallel), dest_group(group) {}
6 void FetchGroup::operator() (pqxx::transaction<> &t)
8 // note: this _will_ break if any song has more than one short title!
9 pqxx::result res( t.exec("SELECT numqualifying,playmode,difficulty,position,songnumber,player,nick,song,title,COALESCE(shorttitle,title) AS shorttitle,artist,chosen,score FROM rounds NATURAL JOIN roundparticipation NATURAL JOIN players NATURAL JOIN scores NATURAL LEFT JOIN songs NATURAL LEFT JOIN songshorttitles WHERE "
10 "tournament=" + pqxx::to_string(tournament) + " AND " +
11 "round=" + pqxx::to_string(round) + " AND " +
12 "parallel=" + pqxx::to_string(parallel) + " " +
13 "ORDER BY position,songnumber") );
15 curr_group.tournament = tournament;
16 curr_group.round = round;
17 curr_group.parallel = parallel;
19 // massage the data we get back into a Group object and children
21 for (pqxx::result::const_iterator i = res.begin(); i != res.end(); ++i) {
22 curr_group.num_qualifying = i["numqualifying"].as(curr_group.num_qualifying);
24 if (i["player"].as(curr_player) != curr_player) {
27 p.id = i["player"].as(p.id);
28 p.position = i["position"].as(p.id);
29 p.nick = i["nick"].as(p.nick);
32 curr_group.players.push_back(p);
34 curr_player = i["player"].as(curr_player);
37 // note: we _will_ get some duplication here (multiple identical Song
38 // objects), but it isn't the end of the world
42 if (i["song"].is_null()) {
45 so.id = i["song"].as(so.id);
46 so.title = i["title"].as(so.title);
47 so.artist = i["artist"].as(so.artist);
48 so.short_title = i["shorttitle"].as(so.short_title);
52 sc.chosen = i["chosen"].as(sc.chosen);
54 if (i["score"].is_null()) {
57 sc.score = i["score"].as(sc.score);
58 curr_group.players[curr_group.players.size() - 1].total += sc.score;
61 curr_group.players[curr_group.players.size() - 1].scores.push_back(sc);
63 *dest_group = curr_group;