added database
This commit is contained in:
1 parent
c4ea7a4293
commit
4f67cf11bd
30 files changed
+601
-267
No files matched your search
@@ -0,0 +1,99 @@
|
||||
#include "database.h"
|
||||
#include "sql.h"
|
||||
#include "user.h"
|
||||
#include <string.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;
|
||||
}
|
||||
Reference in new issue
Block a user