Files
auth_service_c/src/db_get_all_users.c
T
wt bed968b4e4
Prepare Build and Testing executable binary / Prepare-Build-Testing-With-Make (push) Successful in 12s
Prepare Build and Testing executable binary / Prepare-Build-Testing-With-CMake (push) Successful in 12s
Prepare Build and Testing executable binary / Prepare-Build-Testing-With-Meson (push) Successful in 11s
Prepare Build and Testing executable binary / Prepare-Build-Testing-With-Make-Without-sqlite3 (push) Successful in 8s
Prepare Build and Testing executable binary / Prepare-Build-Testing-With-CMake-Without-sqlite3 (push) Successful in 14s
Prepare Build and Testing executable binary / Prepare-Build-Testing-With-Meson-Without-sqlite3 (push) Successful in 12s
fully featured json file database
2025-10-23 14:16:03 +07:00

111 lines
3.1 KiB
C

#include "database.h"
#include "user.h"
#ifdef USE_SQLITE3
#include "sql.h"
#else
#include "file.h"
#endif
char *db_get_all_users() {
#ifdef USE_SQLITE3
pthread_mutex_lock(&db_mutex);
if (!db) {
fprintf(stderr, "Database not initialized\n");
pthread_mutex_unlock(&db_mutex);
return nullptr;
}
sqlite3_stmt *stmt;
int rc;
rc = sqlite3_prepare_v2(db, SELECT_ALL_USERS_SQL, -1, &stmt, nullptr);
if (rc != SQLITE_OK) {
fprintf(stderr, "Cannot prepare statement: %s\n", sqlite3_errmsg(db));
pthread_mutex_unlock(&db_mutex);
return nullptr;
}
char *result = malloc(1024);
if (!result) {
sqlite3_finalize(stmt);
pthread_mutex_unlock(&db_mutex);
return nullptr;
}
strcpy(result, "[");
size_t result_size = strlen(result);
size_t result_capacity = 1024;
int first_record = 1;
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
int id = sqlite3_column_int(stmt, 0);
const unsigned char *username = sqlite3_column_text(stmt, 1);
const unsigned char *email = sqlite3_column_text(stmt, 2);
const unsigned char *group = sqlite3_column_text(stmt, 4);
int is_superuser = sqlite3_column_int(stmt, 5);
char *escaped_username = json_escape((const char *) username);
char *escaped_email = json_escape((const char *) email);
char *escaped_group = json_escape((const char *) group);
if (!escaped_username || !escaped_email || !escaped_group) {
free(escaped_username);
free(escaped_email);
free(escaped_group);
sqlite3_finalize(stmt);
return NULL;
}
char record[512];
if (sqlite3_column_type(stmt, 2) == SQLITE_NULL) {
snprintf(record, sizeof(record),
"%s{\"id\":%d,\"username\":\"%s\",\"email\":\"%s\",\"group\":"
"\"%s\",\"is_superuser\":%s}",
first_record ? "" : ",", id, escaped_username, escaped_email,
escaped_group, is_superuser ? "true" : "false");
} else {
snprintf(record, sizeof(record),
"%s{\"id\":%d,\"username\":\"%s\",\"email\":\"%s\",\"group\":"
"\"%s\",\"is_superuser\":%s}",
first_record ? "" : ",", id, escaped_username, escaped_email,
escaped_group, is_superuser ? "true" : "false");
}
free(escaped_username);
free(escaped_email);
free(escaped_group);
size_t record_len = strlen(record);
if (result_size + record_len + 10 > result_capacity) {
result_capacity *= 2;
char *new_result = realloc(result, result_capacity);
if (!new_result) {
free(result);
sqlite3_finalize(stmt);
return nullptr;
}
result = new_result;
}
strcat(result, record);
result_size += record_len;
first_record = 0;
}
if (rc != SQLITE_DONE) {
fprintf(stderr, "Error reading data: %s\n", sqlite3_errmsg(db));
free(result);
sqlite3_finalize(stmt);
return NULL;
}
strcat(result, "]");
sqlite3_finalize(stmt);
pthread_mutex_unlock(&db_mutex);
return result;
#else
pthread_mutex_lock(&users_file_mutex);
char *data = read_file("users_db.json");
pthread_mutex_unlock(&users_file_mutex);
return data;
#endif
}