BF2MC-Matchmaker
clan_rank.cpp
1 #include <iostream>
2 #include <mysql/mysql.h>
3 
4 #include <settings.h>
5 #include <logger.h>
6 #include <util.h>
7 
8 #include <database.h>
9 
11 {
12  std::lock_guard<std::mutex> guard(this->_mutex); // database lock
13 
14  std::string query = "";
15  query += "SELECT ";
16  query += " `profileid`, `rank` ";
17  query += "FROM ";
18  query += " `ClanRanks` ";
19  query += "WHERE ";
20  query += " `clanid` = ?";
21 
22  int input_clanid = clan.GetClanId();
23 
24  int output_profileid;
25  uint8_t output_rank;
26 
27  // Allocate input binds
28  MYSQL_BIND* input_bind = (MYSQL_BIND *)calloc(1, sizeof(MYSQL_BIND));
29  input_bind[0].buffer_type = MYSQL_TYPE_LONG;
30  input_bind[0].buffer = &input_clanid;
31  input_bind[0].is_unsigned = false;
32 
33  // Allocate output binds
34  MYSQL_BIND* output_bind = (MYSQL_BIND *)calloc(2, sizeof(MYSQL_BIND));
35  output_bind[0].buffer_type = MYSQL_TYPE_LONG;
36  output_bind[0].buffer = &output_profileid;
37  output_bind[0].is_unsigned = false;
38  output_bind[1].buffer_type = MYSQL_TYPE_TINY;
39  output_bind[1].buffer = &output_rank;
40  output_bind[1].is_unsigned = true;
41 
42  // Prepare and execute with binds
43  MYSQL_STMT* statement;
44 
45  if(
46  !this->_init(&statement) ||
47  !this->_prepare(statement, query, input_bind) ||
48  !this->_execute(statement, output_bind)
49  )
50  {
51  // Cleanup
52  free(input_bind);
53  free(output_bind);
54 
55  return false;
56  }
57 
58  while(true)
59  {
60  int status = mysql_stmt_fetch(statement);
61 
62  if (status == 1 || status == MYSQL_NO_DATA)
63  {
64  break;
65  }
66 
67  clan.AddRank(output_profileid, output_rank);
68  }
69 
70  // Cleanup
71  mysql_stmt_free_result(statement);
72  mysql_stmt_close(statement);
73  free(input_bind);
74  free(output_bind);
75 
76  return true;
77 }
78 
80 {
81  std::lock_guard<std::mutex> guard(this->_mutex); // database lock
82 
83  std::string query = "";
84  query += "INSERT INTO `ClanRanks` ";
85  query += " (`clanid`, `profileid`, `rank`) ";
86  query += "VALUES ";
87  query += " (?, ?, ?)";
88 
89  int input_clanid = clan.GetClanId();
90  int input_profileid = player.GetProfileId();
91  uint8_t input_rank = static_cast<uint8_t>(rank);
92 
93  // Allocate input binds
94  MYSQL_BIND* input_bind = (MYSQL_BIND *)calloc(3, sizeof(MYSQL_BIND));
95  input_bind[0].buffer_type = MYSQL_TYPE_LONG;
96  input_bind[0].buffer = &input_clanid;
97  input_bind[0].is_unsigned = false;
98  input_bind[1].buffer_type = MYSQL_TYPE_LONG;
99  input_bind[1].buffer = &input_profileid;
100  input_bind[1].is_unsigned = false;
101  input_bind[2].buffer_type = MYSQL_TYPE_TINY;
102  input_bind[2].buffer = &input_rank;
103  input_bind[2].is_unsigned = true;
104 
105  // Prepare and execute with binds
106  MYSQL_STMT* statement;
107 
108  if(
109  !this->_init(&statement) ||
110  !this->_prepare(statement, query, input_bind) ||
111  !this->_execute(statement)
112  )
113  {
114  // Cleanup
115  free(input_bind);
116 
117  return false;
118  }
119 
120  // Cleanup
121  mysql_stmt_free_result(statement);
122  mysql_stmt_close(statement);
123  free(input_bind);
124 
125  return true;
126 }
127 
129 {
130  std::lock_guard<std::mutex> guard(this->_mutex); // database lock
131 
132  std::string query = "";
133  query += "UPDATE ";
134  query += " `ClanRanks` ";
135  query += "SET ";
136  query += " `rank` = ? ";
137  query += "WHERE ";
138  query += " `clanid` = ? ";
139  query += "AND ";
140  query += " `profileid` = ?";
141 
142  uint8_t input_rank = static_cast<uint8_t>(rank);
143  int input_clanid = clan.GetClanId();
144  int input_profileid = player.GetProfileId();
145 
146  // Allocate input binds
147  MYSQL_BIND* input_bind = (MYSQL_BIND *)calloc(3, sizeof(MYSQL_BIND));
148  input_bind[0].buffer_type = MYSQL_TYPE_TINY;
149  input_bind[0].buffer = &input_rank;
150  input_bind[0].is_unsigned = true;
151  input_bind[1].buffer_type = MYSQL_TYPE_LONG;
152  input_bind[1].buffer = &input_clanid;
153  input_bind[1].is_unsigned = false;
154  input_bind[2].buffer_type = MYSQL_TYPE_LONG;
155  input_bind[2].buffer = &input_profileid;
156  input_bind[2].is_unsigned = false;
157 
158  // Prepare and execute with binds
159  MYSQL_STMT* statement;
160 
161  if(
162  !this->_init(&statement) ||
163  !this->_prepare(statement, query, input_bind) ||
164  !this->_execute(statement)
165  )
166  {
167  // Cleanup
168  free(input_bind);
169 
170  return false;
171  }
172 
173  // Cleanup
174  mysql_stmt_free_result(statement);
175  mysql_stmt_close(statement);
176  free(input_bind);
177 
178  return true;
179 }
180 
182 {
183  std::lock_guard<std::mutex> guard(this->_mutex); // database lock
184 
185  std::string query = "";
186  query += "DELETE FROM ";
187  query += " `ClanRanks` ";
188  query += "WHERE ";
189  query += " `clanid` = ? ";
190  query += "AND ";
191  query += " `profileid` = ?";
192 
193  int input_clanid = clan.GetClanId();
194  int input_profileid = player.GetProfileId();
195 
196  // Allocate input binds
197  MYSQL_BIND* input_bind = (MYSQL_BIND *)calloc(2, sizeof(MYSQL_BIND));
198  input_bind[0].buffer_type = MYSQL_TYPE_LONG;
199  input_bind[0].buffer = &input_clanid;
200  input_bind[0].is_unsigned = false;
201  input_bind[1].buffer_type = MYSQL_TYPE_LONG;
202  input_bind[1].buffer = &input_profileid;
203  input_bind[1].is_unsigned = false;
204 
205  // Prepare and execute with binds
206  MYSQL_STMT* statement;
207 
208  if(
209  !this->_init(&statement) ||
210  !this->_prepare(statement, query, input_bind) ||
211  !this->_execute(statement)
212  )
213  {
214  // Cleanup
215  free(input_bind);
216 
217  return false;
218  }
219 
220  // Cleanup
221  mysql_stmt_free_result(statement);
222  mysql_stmt_close(statement);
223  free(input_bind);
224 
225  return true;
226 }
227 
229 {
230  std::lock_guard<std::mutex> guard(this->_mutex); // database lock
231 
232  std::string query = "";
233  query += "DELETE FROM ";
234  query += " `ClanRanks` ";
235  query += "WHERE ";
236  query += " `clanid` = ?";
237 
238  int input_clanid = clan.GetClanId();
239 
240  // Allocate input binds
241  MYSQL_BIND* input_bind = (MYSQL_BIND *)calloc(1, sizeof(MYSQL_BIND));
242  input_bind[0].buffer_type = MYSQL_TYPE_LONG;
243  input_bind[0].buffer = &input_clanid;
244  input_bind[0].is_unsigned = false;
245 
246  // Prepare and execute with binds
247  MYSQL_STMT* statement;
248 
249  if(
250  !this->_init(&statement) ||
251  !this->_prepare(statement, query, input_bind) ||
252  !this->_execute(statement)
253  )
254  {
255  // Cleanup
256  free(input_bind);
257 
258  return false;
259  }
260 
261  // Cleanup
262  mysql_stmt_free_result(statement);
263  mysql_stmt_close(statement);
264  free(input_bind);
265 
266  return true;
267 }
Represents a clan in the Battlefield game.
Definition: clan.h:54
Ranks
Represents the ranks within a clan.
Definition: clan.h:77
Represents a player with extended statistics.
Definition: player.h:38
bool removeClanRank(const Battlefield::Clan &clan, const Battlefield::Player &player)
Removes the rank of a player within a clan from the database.
Definition: clan_rank.cpp:181
bool _prepare(MYSQL_STMT *statement, const std::string &query)
Prepares a MySQL statement with a query.
Definition: database.cpp:59
bool updateClanRank(const Battlefield::Clan &clan, const Battlefield::Player &player, Battlefield::Clan::Ranks rank)
Updates the rank of a player within a clan in the database.
Definition: clan_rank.cpp:128
bool _init(MYSQL_STMT **statement)
Initializes a MySQL statement object.
Definition: database.cpp:45
bool removeClanRanksByClanId(const Battlefield::Clan &clan)
Removes all ranks associated with a clan from the database.
Definition: clan_rank.cpp:228
bool queryClanRanksByClanId(Battlefield::Clan &clan)
Queries the ranks of a clan by its clan ID.
Definition: clan_rank.cpp:10
bool _execute(MYSQL_STMT *statement)
Executes a prepared MySQL statement.
Definition: database.cpp:94
bool insertClanRank(const Battlefield::Clan &clan, const Battlefield::Player &player, Battlefield::Clan::Ranks rank)
Inserts a rank for a player within a clan into the database.
Definition: clan_rank.cpp:79
std::mutex _mutex
Mutex for thread-safe access to the database connection.
Definition: database.h:42