Prepare Build and Testing executable binary / Prepare-Build-Testing-With-Make (push) Successful in 10s
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 12s
100 lines
2.9 KiB
C
100 lines
2.9 KiB
C
#include <string.h>
|
|
|
|
#include "database.h"
|
|
#include "sql.h"
|
|
#include "user.h"
|
|
|
|
char *db_get_all_users() {
|
|
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;
|
|
} |