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
120 lines
3.7 KiB
C
120 lines
3.7 KiB
C
#include "database.h"
|
|
#include "user.h"
|
|
|
|
#ifdef USE_SQLITE3
|
|
#include "sql.h"
|
|
#else
|
|
#include "cJSON.h"
|
|
#include "file.h"
|
|
#endif
|
|
|
|
User *db_insert_user(const char *username, const char *email,
|
|
const char *password, const char *group,
|
|
const bool *is_superuser) {
|
|
#ifdef USE_SQLITE3
|
|
pthread_mutex_lock(&db_mutex);
|
|
if (!db) {
|
|
fprintf(stderr, "Databse not initialized\n");
|
|
pthread_mutex_unlock(&db_mutex);
|
|
return nullptr;
|
|
}
|
|
if (!username || !email || !password) {
|
|
fprintf(stderr, "username, email, password connot be empty\n");
|
|
pthread_mutex_unlock(&db_mutex);
|
|
return nullptr;
|
|
}
|
|
const char *sql = nullptr;
|
|
sqlite3_stmt *stmt;
|
|
int rc;
|
|
if (!group || !is_superuser) {
|
|
sql = INSERT_USER_USERNAME_EMAIL_PASSWORD_SQL;
|
|
} else if (!group) {
|
|
sql = INSERT_USER_USERNAME_EMAIL_PASSWORD_GROUP_SQL;
|
|
} else {
|
|
sql = INSERT_USER_FULL_SQL;
|
|
}
|
|
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
|
|
if (rc != SQLITE_OK) {
|
|
fprintf(stderr, "Cannot prepare statement: %s\n", sqlite3_errmsg(db));
|
|
pthread_mutex_unlock(&db_mutex);
|
|
return nullptr;
|
|
}
|
|
|
|
sqlite3_bind_text(stmt, 1, username, -1, SQLITE_STATIC);
|
|
sqlite3_bind_text(stmt, 2, email, -1, SQLITE_STATIC);
|
|
sqlite3_bind_text(stmt, 3, password, -1, SQLITE_STATIC);
|
|
|
|
if (group) {
|
|
sqlite3_bind_text(stmt, 4, group, -1, SQLITE_STATIC);
|
|
}
|
|
if (is_superuser) {
|
|
sqlite3_bind_int(stmt, 5, *is_superuser);
|
|
}
|
|
|
|
rc = sqlite3_step(stmt);
|
|
if (rc != SQLITE_DONE) {
|
|
fprintf(stderr, "Execution failed: %s\n", sqlite3_errmsg(db));
|
|
sqlite3_finalize(stmt);
|
|
pthread_mutex_unlock(&db_mutex);
|
|
return nullptr;
|
|
}
|
|
|
|
int inserted_id = sqlite3_last_insert_rowid(db);
|
|
|
|
sqlite3_finalize(stmt);
|
|
printf("User inserted successfully. ID: %d\n", inserted_id);
|
|
pthread_mutex_unlock(&db_mutex);
|
|
User *new_db_user =
|
|
new_user(inserted_id, username, email, password, group, is_superuser);
|
|
return new_db_user;
|
|
#else
|
|
pthread_mutex_lock(&users_file_mutex);
|
|
char *data = read_file("users_db.json");
|
|
cJSON *users = cJSON_Parse(data);
|
|
cJSON *user = nullptr;
|
|
int users_size = 0;
|
|
bool found = false;
|
|
cJSON_ArrayForEach(user, users) {
|
|
cJSON *user_username = cJSON_GetObjectItem(user, "username");
|
|
cJSON *user_password = cJSON_GetObjectItem(user, "password");
|
|
cJSON *user_email = cJSON_GetObjectItem(user, "email");
|
|
cJSON *user_group = cJSON_GetObjectItem(user, "group");
|
|
if (!strcmp(user_username->valuestring, username) &&
|
|
!strcmp(user_password->valuestring, password) &&
|
|
!strcmp(user_email->valuestring, email) &&
|
|
!strcmp(user_group->valuestring, group)) {
|
|
found = true;
|
|
}
|
|
users_size++;
|
|
}
|
|
if (found == true) {
|
|
pthread_mutex_unlock(&users_file_mutex);
|
|
return nullptr;
|
|
}
|
|
cJSON *new_user_data = cJSON_CreateObject();
|
|
cJSON_AddNumberToObject(new_user_data, "id", users_size);
|
|
cJSON_AddStringToObject(new_user_data, "username", username);
|
|
cJSON_AddStringToObject(new_user_data, "password", password);
|
|
cJSON_AddStringToObject(new_user_data, "email", email);
|
|
cJSON_AddStringToObject(new_user_data, "group", group);
|
|
cJSON_AddBoolToObject(new_user_data, "is_superuser", *is_superuser);
|
|
char *new_user_data_string = cJSON_Print(new_user_data);
|
|
if (users_size == 0) {
|
|
users = cJSON_CreateArray();
|
|
}
|
|
cJSON_AddItemToArray(users, new_user_data);
|
|
char *new_data = cJSON_Print(users);
|
|
write_file("users_db.json", new_data);
|
|
pthread_mutex_unlock(&users_file_mutex);
|
|
User *return_user =
|
|
new_user(users_size, username, email, password, group, is_superuser);
|
|
free(new_data);
|
|
free(data);
|
|
free(new_user_data_string);
|
|
// cJSON_Delete(new_user_data);
|
|
cJSON_Delete(users);
|
|
if (user != nullptr) cJSON_Delete(user);
|
|
return return_user;
|
|
#endif
|
|
}
|