9 #include <spdlog/spdlog.h>
12 #define DB_SIZE_128 128
13 #define DB_SIZE_2048 2049
14 #define MAX_MEDIUM_BLOB 16777216 - 1
16 #define DB_DEFAULT_HOST "localhost"
17 #define DB_DEFAULT_USER "pi"
18 #define DB_DEFAULT_PASSWD "raspberry"
19 #define DB_DEFAULT_DB "control_system"
20 #define DB_DEFAULT_PORT 3306
21 #define DB_DEFAULT_SOCKET NULL
22 #define DB_DEFAULT_CLIENTFLAGS 0
25 MYSQL *conn_tmp = mysql_init(NULL);
31 if (!mysql_real_connect(conn.get(),
40 spdlog::error(
"db_driver.cpp - (conf) constructor error. Failed to connect to database. Err: {0} - {1}",
41 mysql_errno(conn.get()), mysql_error(conn.get()));
46 spdlog::error(
"db_driver.cpp - (conf) constructor error. Failed to init MYSQL. Returned NULL pointer.");
53 unsigned int port,
const char* socket,
unsigned long cflags)
55 MYSQL *conn_tmp = mysql_init(0);
59 if (!mysql_real_connect(conn.get(), host, user, passwd, db, port, socket, cflags)) {
60 spdlog::error(
"db_driver.cpp - (test/debug) constructor error. Failed to connect to database");
61 mysql_close(conn.get());
65 spdlog::error(
"db_driver.cpp - (test/debug) constructor error. Failed to init MYSQL");
66 mysql_close(conn.get());
76 memset(creds->
uname, 0, 64);
77 memset(creds->
passwd, 0, 64);
80 int par_cnt = 1, res_cnt = 3;
81 MYSQL_BIND bind_par[par_cnt], bind_res[res_cnt];
82 unsigned long lengths [res_cnt] = {0};
83 my_bool is_null [res_cnt] = {0};
84 my_bool is_error [res_cnt] = {0};
86 memset(bind_par, 0,
sizeof(MYSQL_BIND) * par_cnt);
87 memset(bind_res, 0,
sizeof(MYSQL_BIND) * res_cnt);
89 std::string sql =
"SELECT username, password, status FROM cs_users WHERE username = ?";
92 bind_par[0].buffer_type = MYSQL_TYPE_STRING;
94 bind_par[0].buffer = (
char*) uname;
95 bind_par[0].buffer_length = strlen(uname);
103 bind_res[0].buffer_type = MYSQL_TYPE_STRING;
104 bind_res[0].buffer = username;
106 bind_res[0].is_null = &is_null[0];
107 bind_res[0].length = &lengths [0];
108 bind_res[0].error = &is_error [0];
111 bind_res[1].buffer_type = MYSQL_TYPE_STRING;
112 bind_res[1].buffer = password;
114 bind_res[1].is_null = &is_null[1];
115 bind_res[1].length = &lengths [1];
116 bind_res[1].error = &is_error [1];
119 bind_res[2].buffer_type = MYSQL_TYPE_TINY;
120 bind_res[2].buffer = &status;
121 bind_res[2].is_null = &is_null[2];
122 bind_res[2].length = &lengths [2];
123 bind_res[2].error = &is_error [2];
125 MYSQL_STMT *stmt = mysql_stmt_init(conn.get());
127 spdlog::error(
"db_driver.cpp - fnc: query_user_credentials. Failed to init prepared statement.");
130 if (mysql_stmt_prepare(stmt, sql.c_str(), strlen(sql.c_str()))) {
131 spdlog::error(
"db_driver.cpp - fnc: query_user_credentials. Failed to prepare prepared statement.");
132 this->handle_stmt_error(stmt);
135 if (mysql_stmt_bind_param(stmt, bind_par)) {
136 spdlog::error(
"db_driver.cpp - fnc: query_user_credentials. Failed to bind parameters to prepared statement");
137 this->handle_stmt_error(stmt);
140 if (mysql_stmt_bind_result(stmt, bind_res)) {
141 spdlog::error(
"db_driver.cpp - fnc: query_user_credentials. Failed to bind results to prepared statement");
142 this->handle_stmt_error(stmt);
145 if (mysql_stmt_execute(stmt)) {
146 spdlog::error(
"db_driver.cpp - fnc: query_user_credentials. Failed to execute prepared statement");
147 this->handle_stmt_error(stmt);
150 if (mysql_stmt_store_result(stmt)) {
151 spdlog::error(
"db_driver.cpp - fnc: query_user_credentials. Failed to store result of prepared statement");
152 this->handle_stmt_error(stmt);
155 unsigned long long row_cnt = 0;
156 if ((row_cnt = mysql_stmt_num_rows(stmt)) != 1) {
157 spdlog::error(
"db_driver.cpp - fnc: query_user_credentials. Expected 1 result but got {0}!", row_cnt);
158 mysql_stmt_close(stmt);
162 int rv = mysql_stmt_fetch(stmt);
163 if (rv == 1 || rv == MYSQL_NO_DATA) {
164 spdlog::error(
"db_driver.cpp - fnc: query_user_credentials. Failed to fetch result even"
165 " tought it should exist. (rv: {0})", rv);
166 mysql_stmt_close(stmt);
170 bool err_exit =
false;
171 if (is_null[0] || is_error[0] || lengths[0] <= 0) {
172 spdlog::error(
"db_driver.cpp - fnc: query_user_credentials. Username mustn't be NULL, ERROR or EMPTY!");
175 strcpy(creds->
uname, username);
177 if (is_null[1] || is_error[1] || lengths[1] <= 0) {
178 spdlog::error(
"db_driver.cpp - fnc: query_user_credentials. Password mustn't be NULL, ERROR or EMPTY!");
181 strcpy(creds->
passwd, password);
183 if (is_null[2] || is_error[2] || lengths[2] <= 0) {
184 spdlog::error(
"db_driver.cpp - fnc: query_user_credentials. Role mustn't be NULL, ERROR or EMPTY!");
190 mysql_stmt_close(stmt);
192 spdlog::error(
"db_driver.cpp - fnc: query_user_credentials. Failed to retrieve some critical data.");
200 if (uname ==
nullptr && rfid_serial ==
nullptr) {
201 spdlog::error(
"db_driver.cpp - fnc: query_user_data. The function must be called with either uname"
202 " or rfid serial number");
206 int par_cnt = 1, res_cnt = 13;
207 MYSQL_BIND bind_par[par_cnt], bind_res[res_cnt];
208 unsigned long lengths [res_cnt] = {0};
209 my_bool is_null [res_cnt] = {0};
210 my_bool is_error [res_cnt] = {0};
212 memset(bind_par, 0,
sizeof(MYSQL_BIND) * par_cnt);
213 memset(bind_res, 0,
sizeof(MYSQL_BIND) * res_cnt);
219 sql =
"SELECT id, role, username, password, rfid_serial, description, name, lastname, reg_date,"
220 " last_login_date, created_at, date_of_birth, measure_count FROM cs_users WHERE rfid_serial = ?";
222 unsigned long len = rfid_ser_len;
223 bind_par[0].buffer_type = MYSQL_TYPE_TINY_BLOB;
224 bind_par[0].buffer = rfid_serial;
225 bind_par[0].length = &len;
229 if (uname && !rfid_serial) {
231 sql =
"SELECT id, role, username, password, rfid_serial, description, name, lastname, reg_date,"
232 " last_login_date, created_at, date_of_birth, measure_count FROM cs_users WHERE username = ?";
234 bind_par[0].buffer_type = MYSQL_TYPE_STRING;
236 bind_par[0].buffer = (
char*) uname;
237 bind_par[0].buffer_length = strlen(uname);
243 unsigned long id = 0, measure_count = 0;
247 MYSQL_TIME reg_date, ll_date, create_date, dob_date;
250 bind_res[0].buffer_type = MYSQL_TYPE_LONG;
251 bind_res[0].buffer = &id;
252 bind_res[0].is_null = &is_null[0];
253 bind_res[0].length = &lengths [0];
254 bind_res[0].error = &is_error [0];
257 bind_res[1].buffer_type = MYSQL_TYPE_TINY;
258 bind_res[1].buffer = &role;
259 bind_res[1].is_null = &is_null[1];
260 bind_res[1].length = &lengths [1];
261 bind_res[1].error = &is_error [1];
264 bind_res[2].buffer_type = MYSQL_TYPE_STRING;
265 bind_res[2].buffer = username;
267 bind_res[2].is_null = &is_null[2];
268 bind_res[2].length = &lengths [2];
269 bind_res[2].error = &is_error [2];
272 bind_res[3].buffer_type = MYSQL_TYPE_STRING;
273 bind_res[3].buffer = password;
275 bind_res[3].is_null = &is_null[3];
276 bind_res[3].length = &lengths [3];
277 bind_res[3].error = &is_error [3];
280 bind_res[4].buffer_type = MYSQL_TYPE_TINY_BLOB;
281 bind_res[4].buffer = rfid_ser;
283 bind_res[4].is_null = &is_null[4];
284 bind_res[4].length = &lengths [4];
285 bind_res[4].error = &is_error [4];
288 bind_res[5].buffer_type = MYSQL_TYPE_STRING;
289 bind_res[5].buffer = description;
291 bind_res[5].is_null = &is_null[5];
292 bind_res[5].length = &lengths [5];
293 bind_res[5].error = &is_error [5];
296 bind_res[6].buffer_type = MYSQL_TYPE_STRING;
297 bind_res[6].buffer = name;
299 bind_res[6].is_null = &is_null[6];
300 bind_res[6].length = &lengths [6];
301 bind_res[6].error = &is_error [6];
304 bind_res[7].buffer_type = MYSQL_TYPE_STRING;
305 bind_res[7].buffer = lastname;
307 bind_res[7].is_null = &is_null[7];
308 bind_res[7].length = &lengths [7];
309 bind_res[7].error = &is_error [7];
312 bind_res[8].buffer_type = MYSQL_TYPE_TIMESTAMP;
313 bind_res[8].buffer = ®_date;
314 bind_res[8].is_null = &is_null[8];
315 bind_res[8].length = &lengths [8];
316 bind_res[8].error = &is_error [8];
319 bind_res[9].buffer_type = MYSQL_TYPE_TIMESTAMP;
320 bind_res[9].buffer = &ll_date;
321 bind_res[9].is_null = &is_null[9];
322 bind_res[9].length = &lengths [9];
323 bind_res[9].error = &is_error [9];
326 bind_res[10].buffer_type = MYSQL_TYPE_TIMESTAMP;
327 bind_res[10].buffer = &create_date;
328 bind_res[10].is_null = &is_null[10];
329 bind_res[10].length = &lengths [10];
330 bind_res[10].error = &is_error [10];
333 bind_res[11].buffer_type = MYSQL_TYPE_DATE;
334 bind_res[11].buffer = &dob_date;
335 bind_res[11].is_null = &is_null[11];
336 bind_res[11].length = &lengths [11];
337 bind_res[11].error = &is_error [11];
340 bind_res[12].buffer_type = MYSQL_TYPE_LONG;
341 bind_res[12].buffer = &measure_count;
342 bind_res[12].is_null = &is_null[12];
343 bind_res[12].length = &lengths [12];
344 bind_res[12].error = &is_error [12];
347 MYSQL_STMT *stmt = mysql_stmt_init(conn.get());
349 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Failed to init prepared statement.");
352 if (mysql_stmt_prepare(stmt, sql.c_str(), strlen(sql.c_str()))) {
353 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Failed to prepare prepared statement.");
354 this->handle_stmt_error(stmt);
357 if (mysql_stmt_bind_param(stmt, bind_par)) {
358 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Failed to bind parameters to prepared statement");
359 this->handle_stmt_error(stmt);
362 if (mysql_stmt_bind_result(stmt, bind_res)) {
363 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Failed to bind results to prepared statement");
364 this->handle_stmt_error(stmt);
367 if (mysql_stmt_execute(stmt)) {
368 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Failed to execute prepared statement");
369 this->handle_stmt_error(stmt);
372 if (mysql_stmt_store_result(stmt)) {
373 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Failed to store result of prepared statement");
374 this->handle_stmt_error(stmt);
377 unsigned long long row_cnt = 0;
378 if ((row_cnt = mysql_stmt_num_rows(stmt)) != 1) {
379 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Expected 1 result but got {0}!", row_cnt);
380 mysql_stmt_close(stmt);
384 int rv = mysql_stmt_fetch(stmt);
385 if (rv == 1 || rv == MYSQL_NO_DATA) {
386 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Failed to fetch result even"
387 " tought it should exist. (rv: {0})", rv);
388 mysql_stmt_close(stmt);
395 bool err_exit =
false;
396 if (is_null[0] || is_error[0]) {
397 spdlog::error(
"db_driver.cpp - fnc: query_user_data. ID mustn't be NULL or ERROR!");
402 if (is_null[1] || is_error[1]) {
403 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Role mustn't be NULL or ERROR!");
408 if (is_null[2] || is_error[2] || lengths[2] <= 0) {
409 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Username mustn't be NULL, ERROR or EMPTY!");
414 if (is_null[3] || is_error[3]) {
415 spdlog::debug(
"db_driver.cpp - fnc: query_user_data. Failed to read password");
419 spdlog::error(
"db_driver.cpp - fnc: query_user_data. RFID is in error.");
422 if (is_null[4] || lengths[4] <= 0) {
423 spdlog::debug(
"db_driver.cpp - fnc: query_user_data. RFID is NULL or EMPTY");
427 if (lengths[4] <= 10) {
431 spdlog::error(
"db_driver.cpp - fnc: query_user_data."
432 " RFID is longer than 10 Bytes which should be impossible.");
436 if (is_null[5] || is_error[5]) {
437 spdlog::debug(
"db_driver.cpp - fnc: query_user_data. Description is empty or error. Not doing anything");
442 if (is_null[6] || is_error[6] || lengths[6] <= 0) {
443 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Name mustn't be NULL, ERROR or EMPTY!");
448 if (is_null[7] || is_error[7] || lengths[7] <= 0) {
449 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Lastname mustn't be NULL, ERROR or EMPTY!");
454 if (is_null[8] || is_error[8]) {
455 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Reg_date mustn't be NULL or ERROR!");
458 mysql_time_to_tm(®_date, &(usr->
reg_date));
461 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Last_login_date mustn't be ERROR!");
465 spdlog::debug(
"db_driver.cpp - fnc: query_user_data. Last_login_date is NULL!");
470 if (is_null[10] || is_error[10]) {
471 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Created_at date mustn't be NULL or ERROR!");
476 if (is_null[11] || is_error[11]) {
477 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Date_of_birth mustn't be NULL or ERROR!");
482 if (is_null[12] || is_error[12]) {
483 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Measure_count mustn't be NULL or ERROR!");
489 mysql_stmt_close(stmt);
491 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Failed to retrieve some critical data.");
499 int par_cnt = 1, res_cnt = 1;
500 MYSQL_BIND bind_par[par_cnt], bind_res[res_cnt];
501 unsigned long lengths [res_cnt] = {0};
502 my_bool is_null [res_cnt] = {0};
503 my_bool is_error [res_cnt] = {0};
505 memset(bind_par, 0,
sizeof(MYSQL_BIND) * par_cnt);
506 memset(bind_res, 0,
sizeof(MYSQL_BIND) * res_cnt);
508 std::string sql =
"SELECT username FROM cs_users WHERE id = ?";
511 bind_par[0].buffer_type = MYSQL_TYPE_LONG;
512 bind_par[0].buffer = &id;
517 bind_res[0].buffer_type = MYSQL_TYPE_STRING;
518 bind_res[0].buffer = &name_buf;
520 bind_res[0].is_null = &is_null[0];
521 bind_res[0].length = &lengths [0];
522 bind_res[0].error = &is_error [0];
524 MYSQL_STMT *stmt = mysql_stmt_init(conn.get());
526 spdlog::error(
"db_driver.cpp - fnc: query_username. Failed to init prepared statement.");
529 if (mysql_stmt_prepare(stmt, sql.c_str(), strlen(sql.c_str()))) {
530 spdlog::error(
"db_driver.cpp - fnc: query_username. Failed to prepare prepared statement.");
531 this->handle_stmt_error(stmt);
534 if (mysql_stmt_bind_param(stmt, bind_par)) {
535 spdlog::error(
"db_driver.cpp - fnc: query_username. Failed to bind parameters to prepared statement");
536 this->handle_stmt_error(stmt);
539 if (mysql_stmt_bind_result(stmt, bind_res)) {
540 spdlog::error(
"db_driver.cpp - fnc: query_username. Failed to bind results to prepared statement");
541 this->handle_stmt_error(stmt);
544 if (mysql_stmt_execute(stmt)) {
545 spdlog::error(
"db_driver.cpp - fnc: query_username. Failed to execute prepared statement");
546 this->handle_stmt_error(stmt);
549 if (mysql_stmt_store_result(stmt)) {
550 spdlog::error(
"db_driver.cpp - fnc: query_username. Failed to store result of prepared statement");
551 this->handle_stmt_error(stmt);
554 unsigned long long row_cnt = 0;
555 if ((row_cnt = mysql_stmt_num_rows(stmt)) != 1) {
556 spdlog::error(
"db_driver.cpp - fnc: query_username. Got {0} results! Expected 1.", row_cnt);
557 mysql_stmt_close(stmt);
561 int rv = mysql_stmt_fetch(stmt);
562 if (rv == 1 || rv == MYSQL_NO_DATA) {
563 spdlog::error(
"db_driver.cpp - fnc: query_username. Failed to fetch result even"
564 " tought it should exist. (rv: {0})", rv);
568 if (is_null[0] || is_error[0]) {
569 spdlog::error(
"db_driver.cpp - fnc: query_username. Username mustn't be NULL or ERROR!");
570 mysql_stmt_close(stmt);
576 mysql_stmt_close(stmt);
581 int par_cnt = 1, res_cnt = 4;
582 MYSQL_BIND bind_par[par_cnt], bind_res[res_cnt];
583 unsigned long lengths [res_cnt] = {0};
584 my_bool is_null [res_cnt] = {0};
585 my_bool is_error [res_cnt] = {0};
587 memset(bind_par, 0,
sizeof(MYSQL_BIND) * par_cnt);
588 memset(bind_res, 0,
sizeof(MYSQL_BIND) * res_cnt);
591 std::string sql =
"SELECT id, measurement_number, measuring_start, measuree_id FROM"
592 " cs_measurements WHERE measuree_id = ? AND status = 1 AND measurement_part = 1"
593 " ORDER BY created_at DESC";
596 bind_par[0].buffer_type = MYSQL_TYPE_LONG;
597 bind_par[0].buffer = (
void*) &(usr->
id);
600 unsigned long id = 0, measurement_number = 0, measuree_id = 0;
601 MYSQL_TIME measuring_start;
604 bind_res[0].buffer_type = MYSQL_TYPE_LONG;
605 bind_res[0].buffer = &id;
606 bind_res[0].is_null = &is_null[0];
607 bind_res[0].length = &lengths [0];
608 bind_res[0].error = &is_error [0];
611 bind_res[1].buffer_type = MYSQL_TYPE_LONG;
612 bind_res[1].buffer = &measurement_number;
613 bind_res[1].is_null = &is_null[1];
614 bind_res[1].length = &lengths [1];
615 bind_res[1].error = &is_error [1];
618 bind_res[2].buffer_type = MYSQL_TYPE_TIMESTAMP;
619 bind_res[2].buffer = &measuring_start;
620 bind_res[2].is_null = &is_null[2];
621 bind_res[2].length = &lengths [2];
622 bind_res[2].error = &is_error [2];
625 bind_res[3].buffer_type = MYSQL_TYPE_LONG;
626 bind_res[3].buffer = &measuree_id;
627 bind_res[3].is_null = &is_null[3];
628 bind_res[3].length = &lengths [3];
629 bind_res[3].error = &is_error [3];
631 MYSQL_STMT *stmt = mysql_stmt_init(conn.get());
633 spdlog::error(
"db_driver.cpp - fnc: query_measurement_headers. Failed to init prepared statement.");
636 if (mysql_stmt_prepare(stmt, sql.c_str(), strlen(sql.c_str()))) {
637 spdlog::error(
"db_driver.cpp - fnc: query_measurement_headers. Failed to prepare prepared statement.");
638 this->handle_stmt_error(stmt);
641 if (mysql_stmt_bind_param(stmt, bind_par)) {
642 spdlog::error(
"db_driver.cpp - fnc: query_measurement_headers. Failed to bind parameters to prepared statement");
643 this->handle_stmt_error(stmt);
646 if (mysql_stmt_bind_result(stmt, bind_res)) {
647 spdlog::error(
"db_driver.cpp - fnc: query_measurement_headers. Failed to bind results to prepared statement");
648 this->handle_stmt_error(stmt);
651 if (mysql_stmt_execute(stmt)) {
652 spdlog::error(
"db_driver.cpp - fnc: query_measurement_headers. Failed to execute prepared statement");
653 this->handle_stmt_error(stmt);
656 if (mysql_stmt_store_result(stmt)) {
657 spdlog::error(
"db_driver.cpp - fnc: query_measurement_headers. Failed to store result of prepared statement");
658 this->handle_stmt_error(stmt);
662 unsigned long long row_cnt = 0;
663 if ((row_cnt = mysql_stmt_num_rows(stmt)) <= 0) {
664 spdlog::info(
"db_driver.cpp - fnc: query_measurement_headers. No rows fetched from stored from DB."
665 " Assuming that user has no measurements yet.");
666 mysql_stmt_close(stmt);
669 spdlog::info(
"db_driver.cpp - fnc: query_measurement_headers. Fetched {0} headers.", row_cnt);
673 bool err_exit =
false;
676 int rv = mysql_stmt_fetch(stmt);
677 if (rv == 1 || rv == MYSQL_NO_DATA) {
683 if (is_null[0] || is_error[0]) {
684 spdlog::error(
"db_driver.cpp - fnc: query_measurement_headers. Measurement ID mustn't be NULL or ERROR!");
689 if (is_null[1] || is_error[1]) {
690 spdlog::error(
"db_driver.cpp - fnc: query_measurement_headers. Measuring number mustn't be NULL or ERROR!");
695 if (is_null[2] || is_error[2]) {
696 spdlog::error(
"db_driver.cpp - fnc: query_measurement_headers. Measuring start mustn't be NULL or ERROR!");
701 if (is_null[3] || is_error[3]) {
702 spdlog::error(
"db_driver.cpp - fnc: query_measurement_headers. Measuree_id mustn't be NULL or ERROR!");
708 usr->
measur_headers.push_back(std::unique_ptr<measurement_header>(h));
711 mysql_stmt_close(stmt);
713 spdlog::error(
"db_driver.cpp - fnc: query_measurement_headers. Failed to retrieve some critical data.");
721 int par_cnt = 1, res_cnt = 17;
722 MYSQL_BIND bind_par[par_cnt], bind_res[res_cnt];
723 unsigned long lengths [res_cnt] = {0};
724 my_bool is_null [res_cnt] = {0};
725 my_bool is_error [res_cnt] = {0};
727 memset(bind_par, 0,
sizeof(MYSQL_BIND) * par_cnt);
728 memset(bind_res, 0,
sizeof(MYSQL_BIND) * res_cnt);
730 std::string sql =
"SELECT id, measurement_number, measuree_id, measurer_id, measuring_length,"
731 " measuring_start, measuring_end, description, value_length, value_count, m_values, x_val_median,"
732 " x_val_avg, all_val_median, all_val_avg, created_at, measurement_part"
733 " FROM cs_measurements WHERE id = ?";
736 bind_par[0].buffer_type = MYSQL_TYPE_LONG;
737 bind_par[0].buffer = (
void*) &p_id;
739 unsigned long id = 0, measurement_number = 0, measuree_id = 0, measurer_id = 0, measuring_length = 0;
740 unsigned long value_count = 0, measurement_part = 0;
742 uint8_t value_length = 0;
743 MYSQL_TIME measuring_start, measuring_end, created_at;
745 double x_val_med = 0.0, x_val_avg = 0.0, all_val_med = 0.0, all_val_avg = 0.0;
747 if (m_values == NULL) {
748 spdlog::error(
"db_driver.cpp - fnc: query_measurement. Failed to allocated buffer for values");
755 bind_res[0].buffer_type = MYSQL_TYPE_LONG;
756 bind_res[0].buffer = &id;
757 bind_res[0].is_null = &is_null[0];
758 bind_res[0].length = &lengths [0];
759 bind_res[0].error = &is_error [0];
762 bind_res[1].buffer_type = MYSQL_TYPE_LONG;
763 bind_res[1].buffer = &measurement_number;
764 bind_res[1].is_null = &is_null[1];
765 bind_res[1].length = &lengths [1];
766 bind_res[1].error = &is_error [1];
769 bind_res[2].buffer_type = MYSQL_TYPE_LONG;
770 bind_res[2].buffer = &measuree_id;
771 bind_res[2].is_null = &is_null[2];
772 bind_res[2].length = &lengths [2];
773 bind_res[2].error = &is_error [2];
776 bind_res[3].buffer_type = MYSQL_TYPE_LONG;
777 bind_res[3].buffer = &measurer_id;
778 bind_res[3].is_null = &is_null[3];
779 bind_res[3].length = &lengths [3];
780 bind_res[3].error = &is_error [3];
783 bind_res[4].buffer_type = MYSQL_TYPE_LONG;
784 bind_res[4].buffer = &measuring_length;
785 bind_res[4].is_null = &is_null[4];
786 bind_res[4].length = &lengths [4];
787 bind_res[4].error = &is_error [4];
790 bind_res[5].buffer_type = MYSQL_TYPE_TIMESTAMP;
791 bind_res[5].buffer = &measuring_start;
792 bind_res[5].is_null = &is_null[5];
793 bind_res[5].length = &lengths [5];
794 bind_res[5].error = &is_error [5];
797 bind_res[6].buffer_type = MYSQL_TYPE_TIMESTAMP;
798 bind_res[6].buffer = &measuring_end;
799 bind_res[6].is_null = &is_null[6];
800 bind_res[6].length = &lengths [6];
801 bind_res[6].error = &is_error [6];
804 bind_res[7].buffer_type = MYSQL_TYPE_STRING;
805 bind_res[7].buffer = description;
807 bind_res[7].is_null = &is_null[7];
808 bind_res[7].length = &lengths [7];
809 bind_res[7].error = &is_error [7];
812 bind_res[8].buffer_type = MYSQL_TYPE_TINY;
813 bind_res[8].buffer = &value_length;
814 bind_res[8].is_null = &is_null[8];
815 bind_res[8].length = &lengths [8];
816 bind_res[8].error = &is_error [8];
819 bind_res[9].buffer_type = MYSQL_TYPE_LONG;
820 bind_res[9].buffer = &value_count;
821 bind_res[9].is_null = &is_null[9];
822 bind_res[9].length = &lengths [9];
823 bind_res[9].error = &is_error [9];
826 bind_res[10].buffer_type = MYSQL_TYPE_MEDIUM_BLOB;
827 bind_res[10].buffer = m_values;
829 bind_res[10].is_null = &is_null[10];
830 bind_res[10].length = &lengths [10];
831 bind_res[10].error = &is_error [10];
834 bind_res[11].buffer_type = MYSQL_TYPE_DOUBLE;
835 bind_res[11].buffer = &x_val_med;
836 bind_res[11].is_null = &is_null[11];
837 bind_res[11].length = &lengths [11];
838 bind_res[11].error = &is_error [11];
841 bind_res[12].buffer_type = MYSQL_TYPE_DOUBLE;
842 bind_res[12].buffer = &x_val_avg;
843 bind_res[12].is_null = &is_null[12];
844 bind_res[12].length = &lengths [12];
845 bind_res[12].error = &is_error [12];
848 bind_res[13].buffer_type = MYSQL_TYPE_DOUBLE;
849 bind_res[13].buffer = &all_val_med;
850 bind_res[13].is_null = &is_null[13];
851 bind_res[13].length = &lengths [13];
852 bind_res[13].error = &is_error [13];
855 bind_res[14].buffer_type = MYSQL_TYPE_DOUBLE;
856 bind_res[14].buffer = &all_val_avg;
857 bind_res[14].is_null = &is_null[14];
858 bind_res[14].length = &lengths [14];
859 bind_res[14].error = &is_error [14];
862 bind_res[15].buffer_type = MYSQL_TYPE_TIMESTAMP;
863 bind_res[15].buffer = &created_at;
864 bind_res[15].is_null = &is_null[15];
865 bind_res[15].length = &lengths [15];
866 bind_res[15].error = &is_error [15];
869 bind_res[16].buffer_type = MYSQL_TYPE_LONG;
870 bind_res[16].buffer = &measurement_part;
871 bind_res[16].is_null = &is_null[16];
872 bind_res[16].length = &lengths [16];
873 bind_res[16].error = &is_error [16];
876 MYSQL_STMT *stmt = mysql_stmt_init(conn.get());
878 spdlog::error(
"db_driver.cpp - fnc: query_measurement. Failed to init prepared statement.");
882 if (mysql_stmt_prepare(stmt, sql.c_str(), strlen(sql.c_str()))) {
883 spdlog::error(
"db_driver.cpp - fnc: query_measurement. Failed to prepare prepared statement.");
884 this->handle_stmt_error(stmt);
888 if (mysql_stmt_bind_param(stmt, bind_par)) {
889 spdlog::error(
"db_driver.cpp - fnc: query_measurement. Failed to bind parameters to prepared statement");
890 this->handle_stmt_error(stmt);
894 if (mysql_stmt_bind_result(stmt, bind_res)) {
895 spdlog::error(
"db_driver.cpp - fnc: query_measurement. Failed to bind results to prepared statement");
896 this->handle_stmt_error(stmt);
900 if (mysql_stmt_execute(stmt)) {
901 spdlog::error(
"db_driver.cpp - fnc: query_measurement. Failed to execute prepared statement");
902 this->handle_stmt_error(stmt);
906 if (mysql_stmt_store_result(stmt)) {
907 spdlog::error(
"db_driver.cpp - fnc: query_measurement. Failed to store result of prepared statement");
908 this->handle_stmt_error(stmt);
912 unsigned long long row_cnt = 0;
913 if ((row_cnt = mysql_stmt_num_rows(stmt)) != 1) {
914 spdlog::error(
"db_driver.cpp - fnc: query_measurement. Expected 1 result but got {0}!", row_cnt);
915 mysql_stmt_close(stmt);
920 int rv = mysql_stmt_fetch(stmt);
921 if (rv == 1 || rv == MYSQL_NO_DATA) {
922 spdlog::error(
"db_driver.cpp - fnc: query_measurement. Failed to fetch result even"
923 " tought it should exist. (rv: {0})", rv);
924 mysql_stmt_close(stmt);
929 bool err_exit =
false;
930 if (is_null[0] || is_error[0]) {
931 spdlog::error(
"db_driver.cpp - fnc: query_user_data. ID mustn't be NULL or ERROR!");
936 if (is_null[1] || is_error[1]) {
937 spdlog::error(
"db_driver.cpp - fnc: query_user_data. measurement_number mustn't be NULL or ERROR!");
942 if (is_null[2] || is_error[2]) {
943 spdlog::error(
"db_driver.cpp - fnc: query_user_data. measuree_id mustn't be NULL or ERROR!");
948 if (is_null[3] || is_error[3]) {
949 spdlog::error(
"db_driver.cpp - fnc: query_user_data. measurer_id mustn't be NULL or ERROR!");
954 if (is_null[4] || is_error[4]) {
955 spdlog::debug(
"db_driver.cpp - fnc: query_user_data. measuring_length is NULL or ERROR!");
959 if (is_null[5] || is_error[5]) {
960 spdlog::error(
"db_driver.cpp - fnc: query_user_data. measuring_start mustn't be NULL or ERROR!");
965 if (is_null[6] || is_error[6]) {
966 spdlog::error(
"db_driver.cpp - fnc: query_user_data. measuring_end mustn't be NULL or ERROR!");
971 if (is_null[7] || is_error[7]) {
972 spdlog::debug(
"db_driver.cpp - fnc: query_user_data. description is NULL or ERROR");
992 if (is_null[9] || is_error[9]) {
993 spdlog::debug(
"db_driver.cpp - fnc: query_user_data. value_count is NULL or ERROR!");
998 if (is_null[10] || is_error[10]) {
999 spdlog::info(
"db_driver.cpp - fnc: query_user_data. m_values is NULL or ERROR!"
1000 " This is accaptable, but shouldn't occur");
1005 for (
unsigned long i = 0; i < val_cnt; i++) {
1006 m->
values.push_back(m_values[i]);
1009 if (is_null[11] || is_error[11]) {
1010 spdlog::error(
"db_driver.cpp - fnc: query_user_data. x_val_median mustn't be NULL or ERROR!");
1015 if (is_null[12] || is_error[12]) {
1016 spdlog::error(
"db_driver.cpp - fnc: query_user_data. x_val_avg mustn't be NULL or ERROR!");
1021 if (is_null[13] || is_error[13]) {
1022 spdlog::error(
"db_driver.cpp - fnc: query_user_data. all_val_median mustn't be NULL or ERROR!");
1027 if (is_null[14] || is_error[14]) {
1028 spdlog::error(
"db_driver.cpp - fnc: query_user_data. all_val_avg mustn't be NULL or ERROR!");
1033 if (is_null[15] || is_error[15]) {
1034 spdlog::debug(
"db_driver.cpp - fnc: query_user_data. measuring_end is NULL or ERROR!");
1036 mysql_time_to_tm(&created_at, &(m->
created_at));
1038 if (is_null[16] || is_error[16]) {
1039 spdlog::error(
"db_driver.cpp - fnc: query_user_data. measurement_part mustn't be NULL or ERROR!");
1047 spdlog::error(
"db_driver.cpp - fnc: query_user_data. Failed to retrieve some critical data.");
1055 unsigned long p_measuree_id)
1057 int par_cnt = 2, res_cnt = 13;
1058 MYSQL_BIND bind_par[par_cnt], bind_res[res_cnt];
1059 unsigned long lengths [res_cnt] = {0};
1060 my_bool is_null [res_cnt] = {0};
1061 my_bool is_error [res_cnt] = {0};
1063 memset(bind_par, 0,
sizeof(MYSQL_BIND) * par_cnt);
1064 memset(bind_res, 0,
sizeof(MYSQL_BIND) * res_cnt);
1066 std::string sql =
"SELECT id, measurement_number, measuree_id, measurer_id, measuring_length,"
1067 " measuring_start, measuring_end, value_count, x_val_median,"
1068 " x_val_avg, all_val_median, all_val_avg, measurement_part"
1069 " FROM cs_measurements WHERE measurement_number = ? AND measuree_id = ?";
1072 bind_par[0].buffer_type = MYSQL_TYPE_LONG;
1073 bind_par[0].buffer = (
void*) &m_number;
1075 bind_par[1].buffer_type = MYSQL_TYPE_LONG;
1076 bind_par[1].buffer = (
void*) &p_measuree_id;
1078 unsigned long id = 0, measurement_number = 0, measuree_id = 0, measurer_id = 0, measuring_length = 0;
1079 unsigned long value_count = 0, measurement_part = 0;
1080 MYSQL_TIME measuring_start, measuring_end;
1081 double x_val_med = 0.0, x_val_avg = 0.0, all_val_med = 0.0, all_val_avg = 0.0;
1084 bind_res[0].buffer_type = MYSQL_TYPE_LONG;
1085 bind_res[0].buffer = &id;
1086 bind_res[0].is_null = &is_null[0];
1087 bind_res[0].length = &lengths [0];
1088 bind_res[0].error = &is_error [0];
1091 bind_res[1].buffer_type = MYSQL_TYPE_LONG;
1092 bind_res[1].buffer = &measurement_number;
1093 bind_res[1].is_null = &is_null[1];
1094 bind_res[1].length = &lengths [1];
1095 bind_res[1].error = &is_error [1];
1098 bind_res[2].buffer_type = MYSQL_TYPE_LONG;
1099 bind_res[2].buffer = &measuree_id;
1100 bind_res[2].is_null = &is_null[2];
1101 bind_res[2].length = &lengths [2];
1102 bind_res[2].error = &is_error [2];
1105 bind_res[3].buffer_type = MYSQL_TYPE_LONG;
1106 bind_res[3].buffer = &measurer_id;
1107 bind_res[3].is_null = &is_null[3];
1108 bind_res[3].length = &lengths [3];
1109 bind_res[3].error = &is_error [3];
1112 bind_res[4].buffer_type = MYSQL_TYPE_LONG;
1113 bind_res[4].buffer = &measuring_length;
1114 bind_res[4].is_null = &is_null[4];
1115 bind_res[4].length = &lengths [4];
1116 bind_res[4].error = &is_error [4];
1119 bind_res[5].buffer_type = MYSQL_TYPE_TIMESTAMP;
1120 bind_res[5].buffer = &measuring_start;
1121 bind_res[5].is_null = &is_null[5];
1122 bind_res[5].length = &lengths [5];
1123 bind_res[5].error = &is_error [5];
1126 bind_res[6].buffer_type = MYSQL_TYPE_TIMESTAMP;
1127 bind_res[6].buffer = &measuring_end;
1128 bind_res[6].is_null = &is_null[6];
1129 bind_res[6].length = &lengths [6];
1130 bind_res[6].error = &is_error [6];
1133 bind_res[7].buffer_type = MYSQL_TYPE_LONG;
1134 bind_res[7].buffer = &value_count;
1135 bind_res[7].is_null = &is_null[7];
1136 bind_res[7].length = &lengths [7];
1137 bind_res[7].error = &is_error [7];
1140 bind_res[8].buffer_type = MYSQL_TYPE_DOUBLE;
1141 bind_res[8].buffer = &x_val_med;
1142 bind_res[8].is_null = &is_null[8];
1143 bind_res[8].length = &lengths [8];
1144 bind_res[8].error = &is_error [8];
1147 bind_res[9].buffer_type = MYSQL_TYPE_DOUBLE;
1148 bind_res[9].buffer = &x_val_avg;
1149 bind_res[9].is_null = &is_null[9];
1150 bind_res[9].length = &lengths [9];
1151 bind_res[9].error = &is_error [9];
1154 bind_res[10].buffer_type = MYSQL_TYPE_DOUBLE;
1155 bind_res[10].buffer = &all_val_med;
1156 bind_res[10].is_null = &is_null[10];
1157 bind_res[10].length = &lengths [10];
1158 bind_res[10].error = &is_error [10];
1161 bind_res[11].buffer_type = MYSQL_TYPE_DOUBLE;
1162 bind_res[11].buffer = &all_val_avg;
1163 bind_res[11].is_null = &is_null[11];
1164 bind_res[11].length = &lengths [11];
1165 bind_res[11].error = &is_error [11];
1168 bind_res[12].buffer_type = MYSQL_TYPE_LONG;
1169 bind_res[12].buffer = &measurement_part;
1170 bind_res[12].is_null = &is_null[12];
1171 bind_res[12].length = &lengths [12];
1172 bind_res[12].error = &is_error [12];
1175 MYSQL_STMT *stmt = mysql_stmt_init(conn.get());
1177 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. Failed to init prepared statement.");
1180 if (mysql_stmt_prepare(stmt, sql.c_str(), strlen(sql.c_str()))) {
1181 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. Failed to prepare prepared statement.");
1182 this->handle_stmt_error(stmt);
1185 if (mysql_stmt_bind_param(stmt, bind_par)) {
1186 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement."
1187 " Failed to bind parameters to prepared statement");
1188 this->handle_stmt_error(stmt);
1191 if (mysql_stmt_bind_result(stmt, bind_res)) {
1192 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. Failed to bind results to prepared statement");
1193 this->handle_stmt_error(stmt);
1196 if (mysql_stmt_execute(stmt)) {
1197 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. Failed to execute prepared statement");
1198 this->handle_stmt_error(stmt);
1201 if (mysql_stmt_store_result(stmt)) {
1202 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. Failed to store result of prepared statement");
1203 this->handle_stmt_error(stmt);
1207 bool err_exit =
false;
1210 int res = mysql_stmt_fetch(stmt);
1211 if (res == 1 || res == MYSQL_NO_DATA) {
1212 spdlog::debug(
"breaking with {0}", res);
1218 if (is_null[0] || is_error[0]) {
1219 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. ID mustn't be NULL or ERROR!");
1224 if (is_null[1] || is_error[1]) {
1225 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. "
1226 "measurement_number mustn't be NULL or ERROR!");
1231 if (is_null[2] || is_error[2]) {
1232 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. measuree_id mustn't be NULL or ERROR!");
1237 if (is_null[3] || is_error[3]) {
1238 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. measurer_id mustn't be NULL or ERROR!");
1243 if (is_null[4] || is_error[4]) {
1244 spdlog::debug(
"db_driver.cpp - fnc: query_continuous_measurement. measuring_length is NULL or ERROR!");
1248 if (is_null[5] || is_error[5]) {
1249 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. "
1250 "measuring_start mustn't be NULL or ERROR!");
1255 if (is_null[6] || is_error[6]) {
1256 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. measuring_end mustn't be NULL or ERROR!");
1265 if (is_null[7] || is_error[7]) {
1266 spdlog::debug(
"db_driver.cpp - fnc: query_continuous_measurement. value_count is NULL or "
1267 "ERROR but that isn't important in continuous measurement.");
1271 if (is_null[8] || is_error[8]) {
1272 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. x_val_median mustn't be NULL or ERROR!");
1277 if (is_null[9] || is_error[9]) {
1278 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. x_val_avg mustn't be NULL or ERROR!");
1283 if (is_null[10] || is_error[10]) {
1284 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. all_val_median mustn't be NULL or ERROR!");
1289 if (is_null[11] || is_error[11]) {
1290 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. all_val_avg mustn't be NULL or ERROR!");
1295 if (is_null[12] || is_error[12]) {
1296 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement."
1297 " measurement_part mustn't be NULL or ERROR!");
1307 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. Failed to retrieve some critical data.");
1315 int par_cnt = 2, res_cnt = 1;
1316 MYSQL_BIND bind_par[par_cnt], bind_res[res_cnt];
1317 unsigned long lengths [res_cnt] = {0};
1318 my_bool is_null [res_cnt] = {0};
1319 my_bool is_error [res_cnt] = {0};
1321 memset(bind_par, 0,
sizeof(MYSQL_BIND) * par_cnt);
1322 memset(bind_res, 0,
sizeof(MYSQL_BIND) * res_cnt);
1324 std::string sql =
"SELECT COUNT(id) FROM cs_measurements WHERE measurement_number = ? AND measuree_id = ?";
1327 bind_par[0].buffer_type = MYSQL_TYPE_LONG;
1328 bind_par[0].buffer = &m_number;
1331 bind_par[1].buffer_type = MYSQL_TYPE_LONG;
1332 bind_par[1].buffer = &measuree_id;
1337 bind_res[0].buffer_type = MYSQL_TYPE_LONG;
1338 bind_res[0].buffer = &m_count;
1339 bind_res[0].is_null = &is_null[0];
1340 bind_res[0].length = &lengths [0];
1341 bind_res[0].error = &is_error [0];
1343 MYSQL_STMT *stmt = mysql_stmt_init(conn.get());
1345 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. Failed to init prepared statement.");
1348 if (mysql_stmt_prepare(stmt, sql.c_str(), strlen(sql.c_str()))) {
1349 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. Failed to prepare prepared statement.");
1350 this->handle_stmt_error(stmt);
1353 if (mysql_stmt_bind_param(stmt, bind_par)) {
1354 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. "
1355 "Failed to bind parameters to prepared statement");
1356 this->handle_stmt_error(stmt);
1359 if (mysql_stmt_bind_result(stmt, bind_res)) {
1360 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. Failed to bind results to prepared statement");
1361 this->handle_stmt_error(stmt);
1364 if (mysql_stmt_execute(stmt)) {
1365 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. Failed to execute prepared statement");
1366 this->handle_stmt_error(stmt);
1369 if (mysql_stmt_store_result(stmt)) {
1370 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. Failed to store result of prepared statement");
1371 this->handle_stmt_error(stmt);
1374 unsigned long long row_cnt = 0;
1375 if ((row_cnt = mysql_stmt_num_rows(stmt)) != 1) {
1376 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. Got {0} results! Expected 1.", row_cnt);
1377 mysql_stmt_close(stmt);
1381 int rv = mysql_stmt_fetch(stmt);
1382 if (rv == 1 || rv == MYSQL_NO_DATA) {
1383 spdlog::error(
"db_driver.cpp - fnc: query_continuous_measurement. Failed to fetch result even"
1384 " tought it should exist. (rv: {0})", rv);
1388 if (is_null[0] || is_error[0]) {
1389 spdlog::error(
"db_driver.cpp - fnc: . Count mustn't be NULL or ERROR!");
1390 mysql_stmt_close(stmt);
1394 mysql_stmt_close(stmt);
1407 MYSQL_BIND bind_par[par_cnt];
1409 memset(bind_par, 0,
sizeof(MYSQL_BIND) * par_cnt);
1411 std::string sql =
"SELECT id FROM cs_users WHERE username = ?";
1414 bind_par[0].buffer_type = MYSQL_TYPE_STRING;
1415 bind_par[0].buffer = (
char*) uname;
1416 bind_par[0].buffer_length = strlen(uname);
1418 MYSQL_STMT *stmt = mysql_stmt_init(conn.get());
1420 spdlog::error(
"db_driver.cpp - fnc: is_username_available. Failed to init prepared statement.");
1423 if (mysql_stmt_prepare(stmt, sql.c_str(), strlen(sql.c_str()))) {
1424 spdlog::error(
"db_driver.cpp - fnc: is_username_available. Failed to prepare prepared statement.");
1425 this->handle_stmt_error(stmt);
1428 if (mysql_stmt_bind_param(stmt, bind_par)) {
1429 spdlog::error(
"db_driver.cpp - fnc: is_username_available. Failed to bind parameters to prepared statement");
1430 this->handle_stmt_error(stmt);
1433 if (mysql_stmt_execute(stmt)) {
1434 spdlog::error(
"db_driver.cpp - fnc: is_username_available. Failed to execute prepared statement");
1435 this->handle_stmt_error(stmt);
1438 if (mysql_stmt_store_result(stmt)) {
1439 spdlog::error(
"db_driver.cpp - fnc: is_username_available. Failed to store result of prepared statement");
1440 this->handle_stmt_error(stmt);
1443 unsigned long long row_cnt = 0;
1444 if ((row_cnt = mysql_stmt_num_rows(stmt)) > 1) {
1445 spdlog::error(
"db_driver.cpp - fnc: is_username_available. Got {0} results!"
1446 "This shouldn't occur, because username should be unique!!", row_cnt);
1447 mysql_stmt_close(stmt);
1451 spdlog::info(
"db_driver.cpp - fnc: is_username_available. Username already exists!");
1452 mysql_stmt_close(stmt);
1456 spdlog::info(
"db_driver.cpp - fnc: is_username_available. Username is available.");
1457 mysql_stmt_close(stmt);
1463 MYSQL_BIND bind_par[par_cnt];
1465 memset(bind_par, 0,
sizeof(MYSQL_BIND) * par_cnt);
1467 std::string sql =
"SELECT id FROM cs_users WHERE rfid_serial = ?";
1470 bind_par[0].buffer_type = MYSQL_TYPE_TINY_BLOB;
1471 bind_par[0].buffer = serial;
1472 bind_par[0].buffer_length = ser_len;
1474 MYSQL_STMT *stmt = mysql_stmt_init(conn.get());
1476 spdlog::error(
"db_driver.cpp - fnc: is_rfid_serial_available. Failed to init prepared statement.");
1479 if (mysql_stmt_prepare(stmt, sql.c_str(), strlen(sql.c_str()))) {
1480 spdlog::error(
"db_driver.cpp - fnc: is_rfid_serial_available. Failed to prepare prepared statement.");
1481 this->handle_stmt_error(stmt);
1484 if (mysql_stmt_bind_param(stmt, bind_par)) {
1485 spdlog::error(
"db_driver.cpp - fnc: is_rfid_serial_available. Failed to bind parameters to prepared statement");
1486 this->handle_stmt_error(stmt);
1489 if (mysql_stmt_execute(stmt)) {
1490 spdlog::error(
"db_driver.cpp - fnc: is_rfid_serial_available. Failed to execute prepared statement");
1491 this->handle_stmt_error(stmt);
1494 if (mysql_stmt_store_result(stmt)) {
1495 spdlog::error(
"db_driver.cpp - fnc: is_rfid_serial_available. Failed to store result of prepared statement");
1496 this->handle_stmt_error(stmt);
1499 unsigned long long row_cnt = 0;
1500 if ((row_cnt = mysql_stmt_num_rows(stmt)) > 1) {
1501 spdlog::error(
"db_driver.cpp - fnc: is_rfid_serial_available. Got {0} results!"
1502 "This shouldn't occur, because username should be unique!!", row_cnt);
1503 mysql_stmt_close(stmt);
1507 spdlog::info(
"db_driver.cpp - fnc: is_rfid_serial_available. RFID already exists!");
1508 mysql_stmt_close(stmt);
1512 spdlog::info(
"db_driver.cpp - fnc: is_rfid_serial_available. RFID is available.");
1513 mysql_stmt_close(stmt);
1519 MYSQL_BIND bind_par[par_cnt];
1521 memset(bind_par, 0,
sizeof(MYSQL_BIND) * par_cnt);
1523 std::string sql =
"UPDATE cs_users SET measure_count = measure_count + 1 WHERE id = ?";
1526 bind_par[0].buffer_type = MYSQL_TYPE_LONG;
1527 bind_par[0].buffer = (
void*) &
id;
1529 MYSQL_STMT *stmt = mysql_stmt_init(conn.get());
1531 spdlog::error(
"db_driver.cpp - fnc: increment_user_measurement_count. Failed to init prepared statement.");
1534 if (mysql_stmt_prepare(stmt, sql.c_str(), strlen(sql.c_str()))) {
1535 spdlog::error(
"db_driver.cpp - fnc: increment_user_measurement_count. Failed to prepare prepared statement.");
1536 this->handle_stmt_error(stmt);
1539 if (mysql_stmt_bind_param(stmt, bind_par)) {
1540 spdlog::error(
"db_driver.cpp - fnc: increment_user_measurement_count."
1541 " Failed to bind parameters to prepared statement");
1542 this->handle_stmt_error(stmt);
1545 if (mysql_stmt_execute(stmt)) {
1546 spdlog::error(
"db_driver.cpp - fnc: increment_user_measurement_count. Failed to execute prepared statement");
1547 this->handle_stmt_error(stmt);
1551 mysql_stmt_close(stmt);
1556 int par_cnt = 1, res_cnt = 1;
1557 MYSQL_BIND bind_par[par_cnt], bind_res[res_cnt];
1558 unsigned long lengths [res_cnt] = {0};
1559 my_bool is_null [res_cnt] = {0};
1560 my_bool is_error [res_cnt] = {0};
1562 memset(bind_par, 0,
sizeof(MYSQL_BIND) * par_cnt);
1563 memset(bind_res, 0,
sizeof(MYSQL_BIND) * res_cnt);
1565 std::string sql =
"SELECT role FROM cs_users WHERE username = ?";
1568 bind_par[0].buffer_type = MYSQL_TYPE_STRING;
1569 bind_par[0].buffer = (
char*) uname;
1570 bind_par[0].buffer_length = strlen(uname);
1575 bind_res[0].buffer_type = MYSQL_TYPE_TINY;
1576 bind_res[0].buffer = &role;
1577 bind_res[0].is_null = &is_null[0];
1578 bind_res[0].length = &lengths [0];
1579 bind_res[0].error = &is_error [0];
1581 MYSQL_STMT *stmt = mysql_stmt_init(conn.get());
1583 spdlog::error(
"db_driver.cpp - fnc: can_login_subuser. Failed to init prepared statement.");
1586 if (mysql_stmt_prepare(stmt, sql.c_str(), strlen(sql.c_str()))) {
1587 spdlog::error(
"db_driver.cpp - fnc: can_login_subuser. Failed to prepare prepared statement.");
1588 this->handle_stmt_error(stmt);
1591 if (mysql_stmt_bind_param(stmt, bind_par)) {
1592 spdlog::error(
"db_driver.cpp - fnc: can_login_subuser. Failed to bind parameters to prepared statement");
1593 this->handle_stmt_error(stmt);
1596 if (mysql_stmt_bind_result(stmt, bind_res)) {
1597 spdlog::error(
"db_driver.cpp - fnc: can_login_subuser. Failed to bind results to prepared statement");
1598 this->handle_stmt_error(stmt);
1601 if (mysql_stmt_execute(stmt)) {
1602 spdlog::error(
"db_driver.cpp - fnc: can_login_subuser. Failed to execute prepared statement");
1603 this->handle_stmt_error(stmt);
1606 if (mysql_stmt_store_result(stmt)) {
1607 spdlog::error(
"db_driver.cpp - fnc: can_login_subuser. Failed to store result of prepared statement");
1608 this->handle_stmt_error(stmt);
1611 unsigned long long row_cnt = 0;
1612 if ((row_cnt = mysql_stmt_num_rows(stmt)) != 1) {
1613 spdlog::error(
"db_driver.cpp - fnc: can_login_subuser. Got {0} results! Expected 1.", row_cnt);
1614 mysql_stmt_close(stmt);
1618 int rv = mysql_stmt_fetch(stmt);
1619 if (rv == 1 || rv == MYSQL_NO_DATA) {
1620 spdlog::error(
"db_driver.cpp - fnc: can_login_subuser. Failed to fetch result even"
1621 " tought it should exist. (rv: {0})", rv);
1625 mysql_stmt_close(stmt);
1627 if (is_null[0] || is_error[0]) {
1628 spdlog::error(
"db_driver.cpp - fnc: can_login_subuser. Role mustn't be NULL or ERROR!");
1632 return role == 0 ? 0 : 3;
1637 MYSQL_BIND bind_par[par_cnt];
1638 unsigned long serial_len = ser_len;
1640 memset(bind_par, 0,
sizeof(MYSQL_BIND) * par_cnt);
1642 std::string sql =
"UPDATE cs_users SET rfid_serial = ? WHERE id = ?";
1645 bind_par[0].buffer_type = MYSQL_TYPE_TINY_BLOB;
1646 bind_par[0].buffer = serial;
1647 bind_par[0].length = &serial_len;
1650 bind_par[1].buffer_type = MYSQL_TYPE_LONG;
1651 bind_par[1].buffer = (
void*) &(user_id);
1653 MYSQL_STMT *stmt = mysql_stmt_init(conn.get());
1655 spdlog::error(
"db_driver.cpp - fnc: update_user_rfid. Failed to init prepared statement.");
1658 if (mysql_stmt_prepare(stmt, sql.c_str(), strlen(sql.c_str()))) {
1659 spdlog::error(
"db_driver.cpp - fnc: update_user_rfid. Failed to prepare prepared statement.");
1660 this->handle_stmt_error(stmt);
1663 if (mysql_stmt_bind_param(stmt, bind_par)) {
1664 spdlog::error(
"db_driver.cpp - fnc: update_user_rfid. Failed to bind parameters to prepared statement");
1665 this->handle_stmt_error(stmt);
1668 if (mysql_stmt_execute(stmt)) {
1669 spdlog::error(
"db_driver.cpp - fnc: update_user_rfid. Failed to execute prepared statement");
1670 this->handle_stmt_error(stmt);
1674 mysql_stmt_close(stmt);
1679 if (password ==
nullptr || strlen(password) <= 0) {
1680 spdlog::error(
"db_driver.cpp - fnc: insert_user. Password musn't be null or empty");
1685 MYSQL_BIND bind_par[par_cnt];
1687 memset(bind_par, 0,
sizeof(MYSQL_BIND) * par_cnt);
1689 std::string sql =
"INSERT INTO"
1690 " cs_users(role, username, password, rfid_serial, description, name, lastname, date_of_birth)"
1691 " VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
1694 bind_par[0].buffer_type = MYSQL_TYPE_TINY;
1695 bind_par[0].buffer = &(new_usr->
role);
1698 bind_par[1].buffer_type = MYSQL_TYPE_STRING;
1699 bind_par[1].buffer = (
char*) new_usr->
username.c_str();
1700 bind_par[1].buffer_length = new_usr->
username.size() + 1;
1703 bind_par[2].buffer_type = MYSQL_TYPE_STRING;
1704 bind_par[2].buffer = (
char*) password;
1705 bind_par[2].buffer_length = strlen(password);
1708 bind_par[3].buffer_type = MYSQL_TYPE_TINY_BLOB;
1710 bind_par[3].buffer =
nullptr;
1717 bind_par[4].buffer_type = MYSQL_TYPE_STRING;
1718 bind_par[4].buffer = (
char*) new_usr->
description.c_str();
1719 bind_par[4].buffer_length = new_usr->
description.size() + 1;
1722 bind_par[5].buffer_type = MYSQL_TYPE_STRING;
1723 bind_par[5].buffer = (
char*) new_usr->
name.c_str();
1724 bind_par[5].buffer_length = new_usr->
name.size() + 1;
1727 bind_par[6].buffer_type = MYSQL_TYPE_STRING;
1728 bind_par[6].buffer = (
char*) new_usr->
lastname.c_str();
1729 bind_par[6].buffer_length = new_usr->
lastname.size() + 1;
1734 bind_par[7].buffer_type = MYSQL_TYPE_STRING;
1735 bind_par[7].buffer = buf;
1736 bind_par[7].buffer_length = strlen(buf);
1739 MYSQL_STMT *stmt = mysql_stmt_init(conn.get());
1741 spdlog::error(
"db_driver.cpp - fnc: insert_user. Failed to init prepared statement.");
1744 if (mysql_stmt_prepare(stmt, sql.c_str(), strlen(sql.c_str()))) {
1745 spdlog::error(
"db_driver.cpp - fnc: insert_user. Failed to prepare prepared statement.");
1746 this->handle_stmt_error(stmt);
1749 if (mysql_stmt_bind_param(stmt, bind_par)) {
1750 spdlog::error(
"db_driver.cpp - fnc: insert_user. Failed to bind parameters to prepared statement");
1751 this->handle_stmt_error(stmt);
1754 if (mysql_stmt_execute(stmt)) {
1755 spdlog::error(
"db_driver.cpp - fnc: insert_user. Failed to execute prepared statement");
1756 this->handle_stmt_error(stmt);
1760 spdlog::info(
"db_driver.cpp - fnc: insert_user. New user added successfully.");
1761 mysql_stmt_close(stmt);
1767 MYSQL_BIND bind_par[par_cnt];
1769 memset(bind_par, 0,
sizeof(MYSQL_BIND) * par_cnt);
1771 std::string sql =
"INSERT INTO cs_measurements(measurement_number, measuree_id, measurer_id, measuring_length,"
1772 " measuring_start, measuring_end, description, value_length, value_count, m_values, x_val_median,"
1773 " x_val_avg, all_val_median, all_val_avg, measurement_part)"
1774 " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
1777 bind_par[0].buffer_type = MYSQL_TYPE_LONG;
1781 bind_par[1].buffer_type = MYSQL_TYPE_LONG;
1785 bind_par[2].buffer_type = MYSQL_TYPE_LONG;
1789 bind_par[3].buffer_type = MYSQL_TYPE_LONG;
1793 char date_start[32] = {0};
1795 bind_par[4].buffer_type = MYSQL_TYPE_STRING;
1796 bind_par[4].buffer = date_start;
1797 bind_par[4].buffer_length = strlen(date_start);
1800 char date_end[32] = {0};
1801 strftime(date_end, 32,
"%Y-%m-%d %H:%M:%S", &(m->
measuring_end));
1802 bind_par[5].buffer_type = MYSQL_TYPE_STRING;
1803 bind_par[5].buffer = date_end;
1804 bind_par[5].buffer_length = strlen(date_end);
1807 bind_par[6].buffer_type = MYSQL_TYPE_STRING;
1808 bind_par[6].buffer = (
char*) m->
description.c_str();
1809 bind_par[6].buffer_length = m->
description.size() + 1;
1812 bind_par[7].buffer_type = MYSQL_TYPE_TINY;
1816 bind_par[8].buffer_type = MYSQL_TYPE_LONG;
1820 bind_par[9].buffer_type = MYSQL_TYPE_MEDIUM_BLOB;
1821 bind_par[9].buffer = m->
values.data();
1822 bind_par[9].buffer_length = m->
values.size() *
sizeof(double);
1825 bind_par[10].buffer_type = MYSQL_TYPE_DOUBLE;
1829 bind_par[11].buffer_type = MYSQL_TYPE_DOUBLE;
1833 bind_par[12].buffer_type = MYSQL_TYPE_DOUBLE;
1837 bind_par[13].buffer_type = MYSQL_TYPE_DOUBLE;
1841 bind_par[14].buffer_type = MYSQL_TYPE_LONG;
1844 MYSQL_STMT *stmt = mysql_stmt_init(conn.get());
1846 spdlog::error(
"db_driver.cpp - fnc: insert_measurement. Failed to init prepared statement.");
1849 if (mysql_stmt_prepare(stmt, sql.c_str(), strlen(sql.c_str()))) {
1850 spdlog::error(
"db_driver.cpp - fnc: insert_measurement. Failed to prepare prepared statement.");
1851 this->handle_stmt_error(stmt);
1854 if (mysql_stmt_bind_param(stmt, bind_par)) {
1855 spdlog::error(
"db_driver.cpp - fnc: insert_measurement. Failed to bind parameters to prepared statement");
1856 this->handle_stmt_error(stmt);
1859 if (mysql_stmt_execute(stmt)) {
1860 spdlog::error(
"db_driver.cpp - fnc: insert_measurement. Failed to execute prepared statement");
1861 this->handle_stmt_error(stmt);
1865 spdlog::info(
"db_driver.cpp - fnc: insert_measurement. Measurement added successfully.");
1866 mysql_stmt_close(stmt);
1870 void db_driver::mysql_time_to_tm(MYSQL_TIME* src, std::tm *dest) {
1873 sprintf(buf,
"%04d-%02d-%02d %02d:%02d:%02d", src->year, src->month, src->day, src->hour, src->minute, src->second);
1874 strptime(buf,
"%Y-%m-%d %H:%M:%S", dest);
1879 void db_driver::handle_stmt_error(MYSQL_STMT* stmt) {
1880 spdlog::error(
"db_driver.cpp - Prepared Statement Error ({0}): [{1}] \"{2}\"",
1881 mysql_stmt_errno(stmt),
1882 mysql_stmt_sqlstate(stmt),
1883 mysql_stmt_error(stmt));
1885 mysql_stmt_close(stmt);
1898 static void show_stmt_error(MYSQL_STMT *stmt)
1900 printf(
"Error(%d) [%s] \"%s\"", mysql_stmt_errno(stmt),
1901 mysql_stmt_sqlstate(stmt),
1902 mysql_stmt_error(stmt));
1905 static char text_test[64] =
"insert from c";
1906 static uint8_t binary_data_test[] = {0x10, 0x50, 0xFF, 0x07, 0xAB, 0xB7, 0xBC, 0xCB, 0xCC, 0x77};
1907 static int int_test = 5;
1908 static float float_test = 8.00719;
1912 MYSQL_BIND bind[bind_count];
1913 std::string sql(
"INSERT INTO test(text_test, int_test, float_test, binary_data, blob_data) VALUES (?, ?, ?, ?, ?)");
1916 memset(bind, 0,
sizeof(MYSQL_BIND) * bind_count);
1918 MYSQL_STMT *stmt = mysql_stmt_init(conn.get());
1919 if (mysql_stmt_prepare(stmt, sql.c_str(), strlen(sql.c_str()))) {
1920 spdlog::error(
"Failed prepared statment.");
1921 show_stmt_error(stmt);
1925 unsigned long bin_count = 10;
1927 bind[0].buffer_type = MYSQL_TYPE_STRING;
1929 bind[0].buffer = text_test;
1930 bind[0].buffer_length = strlen(text_test);
1932 bind[1].buffer_type = MYSQL_TYPE_LONG;
1933 bind[1].buffer = &int_test;
1935 bind[2].buffer_type = MYSQL_TYPE_FLOAT;
1936 bind[2].buffer = &float_test;
1938 bind[3].buffer_type = MYSQL_TYPE_STRING;
1939 bind[3].buffer = binary_data_test;
1940 bind[3].length = &bin_count;
1942 bind[4].buffer_type = MYSQL_TYPE_MEDIUM_BLOB;
1943 bind[4].buffer = binary_data_test;
1944 bind[4].length = &bin_count;
1949 mysql_stmt_bind_param(stmt, bind);
1951 if (mysql_stmt_execute(stmt))
1952 show_stmt_error(stmt);
1954 mysql_stmt_close(stmt);
1960 MYSQL_BIND bind_param[params];
1961 MYSQL_BIND bind_res [results];
1962 unsigned long length[results] = {0};
1963 my_bool is_null [results] = {0};
1964 my_bool error [results] = {0};
1968 std::string sql(
"SELECT text_test, int_test, float_test, binary_data, blob_data FROM test WHERE blob_data = ?");
1971 memset(bind_param, 0,
sizeof(MYSQL_BIND) * params);
1972 memset(bind_res, 0,
sizeof(MYSQL_BIND) * results);
1974 MYSQL_STMT *stmt = mysql_stmt_init(conn.get());
1975 if (mysql_stmt_prepare(stmt, sql.c_str(), strlen(sql.c_str()))) {
1976 spdlog::error(
"Failed prepared statment.");
1977 show_stmt_error(stmt);
1983 unsigned long bin_count = 10;
1988 uint8_t bin_in[128];
1989 uint8_t blob_in[128];
2000 bind_param[0].buffer_type = MYSQL_TYPE_MEDIUM_BLOB;
2001 bind_param[0].buffer = binary_data_test;
2002 bind_param[0].length = &bin_count;
2004 bind_res[0].buffer_type = MYSQL_TYPE_STRING;
2005 bind_res[0].buffer = t_in;
2006 bind_res[0].buffer_length = 128;
2007 bind_res[0].is_null = &is_null [0];
2008 bind_res[0].length = &length [0];
2009 bind_res[0].error = &error [0];
2011 bind_res[1].buffer_type = MYSQL_TYPE_LONG;
2012 bind_res[1].buffer = &i_in;
2013 bind_res[1].is_null = &is_null [1];
2014 bind_res[1].length = &length [1];
2015 bind_res[1].error = &error [1];
2017 bind_res[2].buffer_type = MYSQL_TYPE_FLOAT;
2018 bind_res[2].buffer = &f_in;
2019 bind_res[2].is_null = &is_null [2];
2020 bind_res[2].length = &length [2];
2021 bind_res[2].error = &error [2];
2023 bind_res[3].buffer_type = MYSQL_TYPE_STRING;
2024 bind_res[3].buffer = bin_in;
2025 bind_res[3].buffer_length = 128;
2026 bind_res[3].is_null = &is_null [3];
2027 bind_res[3].length = &length [3];
2028 bind_res[3].error = &error [3];
2030 bind_res[4].buffer_type = MYSQL_TYPE_MEDIUM_BLOB;
2031 bind_res[4].buffer = blob_in;
2032 bind_res[4].buffer_length = 128;
2033 bind_res[4].is_null = &is_null [4];
2034 bind_res[4].length = &length [4];
2035 bind_res[4].error = &error [4];
2040 if (mysql_stmt_bind_param(stmt, bind_param)) {
2041 spdlog::error(
"Failed to bind parameters");
2044 if (mysql_stmt_bind_result(stmt, bind_res)) {
2045 spdlog::error(
"Failed to bind results");
2048 if (mysql_stmt_execute(stmt)) {
2049 spdlog::error(
"Failed to execute statement");
2050 show_stmt_error(stmt);
2053 if (mysql_stmt_store_result(stmt)) {
2054 spdlog::error(
"Failed to store result");
2055 show_stmt_error(stmt);
2062 int res = mysql_stmt_fetch(stmt);
2063 if (res == 1 || res == MYSQL_NO_DATA) {
2064 spdlog::info(
"breaking with {0}", res);
2068 spdlog::info(
"Fetched result");
2070 for (
int i = 0; i < results; i++) {
2071 printf(
"result flags: is_null: %c\terror: %c\tlength: %ld\n", is_null[i], error[i], length[i]);
2073 printf(
"value %d is null\n", i);
2076 printf(
"error in val %d : %d\n", i, error[i]);
2081 printf(
"%s\n", t_in);
2082 printf(
"%d\n", i_in);
2083 printf(
"%f\n", f_in);
2086 long unsigned int len = bin_count;
2087 bool correct =
true;
2088 if (bin_count != length[results - 1]) {
2089 printf(
"blob size mismatch\n");
2090 len = length[results - 1] < len ? length[results - 1] : len;
2092 for (
long unsigned int i = 0; i < len; i++) {
2093 if (binary_data_test[i] != blob_in[i]) {
2094 printf(
"blob data aren't correct on byte %ld\n", i);
2100 printf(
"YEEEEY! blob data match\n");
2102 printf(
"OUCH! blob data dont match\n");
2106 long unsigned int len2 = bin_count;
2107 bool correct2 =
true;
2108 if (bin_count != length[results - 2]) {
2109 printf(
"binary size mismatch, but its expected. Binary is padded with 0 from right\n");
2110 len2 = length[results - 2] < len2 ? length[results - 2] : len2;
2112 for (
long unsigned int i = 0; i < len2; i++) {
2113 if (binary_data_test[i] != blob_in[i]) {
2114 printf(
"binary data aren't correct on byte %ld\n", i);
2120 printf(
"YEEEEY! binary data match\n");
2122 printf(
"OUCH! binary data dont match\n");
2127 mysql_stmt_close(stmt);
2135 int db_driver::test() {
2138 if (!(conn = mysql_init(0)))
2140 fprintf(stderr,
"unable to initialize connection struct\n");
2145 if (!mysql_real_connect(
2156 printf(
"Failed to open mysql connection.\n");
2158 fprintf(stderr,
"Error connecting to Server: %s\n", mysql_error(conn));
2165 const char* sql =
"SELECT * FROM test";
2166 if (mysql_real_query(conn, sql, strlen(sql))) {
2167 printf(
"Failed %s\n", sql);
2171 MYSQL_RES* res = mysql_store_result(conn);
2173 printf(
"RESULT SET is null/ empty\n");
2178 unsigned int num_fields;
2181 num_fields = mysql_num_fields(res);
2182 while ((row = mysql_fetch_row(res))) {
2183 unsigned long *lengths;
2184 lengths = mysql_fetch_lengths(res);
2185 for(i = 0; i < num_fields; i++)
2187 printf(
"[%.*s] ", (
int) lengths[i],
2188 row[i] ? row[i] :
"NULL");
2197 mysql_free_result(res);
int can_login_subuser(const char *uname)
void test_select_with_binary()
int insert_measurement(measurement *m)
int is_username_available(const char *uname)
int is_rfid_serial_available(uint8_t *serial, uint8_t ser_len)
int query_username(std::string &uname, unsigned long id)
int is_measurement_continuous(unsigned long m_number, unsigned long measuree_id)
void test_insert_with_binary()
db_driver(db_driver_conf *conf)
Construct a new db driver object from configuration.
int insert_user(user_cont *new_usr, const char *password)
int update_user_rfid(unsigned long user_id, uint8_t *serial, uint8_t ser_len)
int query_continuous_measurement(std::vector< measurement > &ms, unsigned long m_number, unsigned long measuree_id)
int query_measurement(measurement *m, unsigned long id)
int query_measurement_headers(user_cont *usr)
int query_user_data(user_cont *usr, const char *uname=nullptr, uint8_t *rfid_serial=nullptr, uint8_t rfid_ser_len=0)
Selects all user data into user container @usr. Data is selected by either username or rfid_serial....
int query_user_credentials(user_cred *creds, const char *uname)
Selects username, password and status into @creds filtered by @uname.
int increment_user_measurement_count(unsigned long id)
Container for measurement data and (convenience) variables, that are used to show measurement in GUI.
unsigned long measuring_length
unsigned long measurement_part
std::vector< double > values
unsigned long value_count
unsigned long measuree_id
unsigned long measurer_id
unsigned long measurement_number
Class used as a container for user data, that are selected from database. (and also for insert,...
std::vector< std::unique_ptr< measurement_header > > measur_headers
unsigned long measure_count
uint8_t rfid_serial_bin[10]
#define DB_DEFAULT_PASSWD
#define DB_DEFAULT_SOCKET
#define DB_DEFAULT_CLIENTFLAGS
Container for configuration neccessary to open database connnection.
Struct used to contain username, password and user status until credentials are verified.