From 33e8bed1780d19ead8ca2fb908c44c8c8594eeb2 Mon Sep 17 00:00:00 2001 From: TolaMironcenko Date: Fri, 22 Aug 2025 18:24:04 +0700 Subject: [PATCH] added db_insert_user --- src/db_insert_user.c | 56 ++++++++++++++++++++++++++++++++++++++++++++ src/sql.h | 25 +++++++++++++------- src/user.h | 7 ++++-- 3 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 src/db_insert_user.c diff --git a/src/db_insert_user.c b/src/db_insert_user.c new file mode 100644 index 0000000..409fb1e --- /dev/null +++ b/src/db_insert_user.c @@ -0,0 +1,56 @@ +#include "database.h" +#include "sql.h" +#include "user.h" + +User *db_insert_user(const char *username, const char *email, + const char *password, const char *group, + bool *is_superuser) { + pthread_mutex_lock(&db_mutex); + if (!db) { + fprintf(stderr, "Databse not initialized\n"); + return nullptr; + } + if (!username || !email || !password) { + fprintf(stderr, "username, email, password connot be empty\n"); + 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)); + 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); + 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); +} \ No newline at end of file diff --git a/src/sql.h b/src/sql.h index 4c364e6..88ee2fb 100644 --- a/src/sql.h +++ b/src/sql.h @@ -1,13 +1,13 @@ #pragma once -#define CREATE_TABLE_USERS \ - "create table if not exists users(" \ - "id integer primary key autoincrement," \ - "username text unique," \ - "email char(50) unique," \ - "password char(150) not null," \ - "user_group char(50) default 'users'," \ - "is_superuser boolean default false" \ +#define CREATE_TABLE_USERS \ + "create table if not exists users(" \ + "id integer primary key autoincrement," \ + "username text unique," \ + "email char(50) unique," \ + "password char(150) not null," \ + "user_group char(50) default 'users'," \ + "is_superuser boolean default false" \ ");" #define INSERT_USER_SQL \ @@ -16,4 +16,11 @@ #define SELECT_ALL_USERS_SQL "select * from users" #define SELECT_USER_BY_USERNAME_SQL "select * from users where username = ?" - +#define INSERT_USER_USERNAME_EMAIL_PASSWORD_SQL \ + "insert into users (username, email, password) values (?, ?, ?)" +#define INSERT_USER_USERNAME_EMAIL_PASSWORD_GROUP_SQL \ + "insert into users (username, email, password, user_group) values (?, ?, " \ + "?, ?)" +#define INSERT_USER_FULL_SQL \ + "insert into users (username, email, password, user_group, is_superuser) " \ + "values (?, ?, ?, ?, ?)" diff --git a/src/user.h b/src/user.h index 2e94960..d030b45 100644 --- a/src/user.h +++ b/src/user.h @@ -13,8 +13,8 @@ typedef struct User { bool is_superuser; } User; -User *new_user(int id, const char *username, const char *password, const char *email, - const char *group, bool is_superuser); +User *new_user(int id, const char *username, const char *password, + const char *email, const char *group, bool is_superuser); void free_user(User *user); @@ -55,3 +55,6 @@ void verify_token(struct mg_connection *c, struct mg_http_message *hm); void db_get_users_from_file(const char *filename); char *db_get_all_users(); User *db_get_user_by_username(const char *username); +User *db_insert_user(const char *username, const char *email, + const char *password, const char *group, + bool *is_superuser);