#include #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; }