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