summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryuzu-eva <cafebabe@disroot.org>2025-04-11 20:21:00 +0200
committeryuzu-eva <cafebabe@disroot.org>2025-04-11 20:21:00 +0200
commit85549c89b0241ad22d102aaf19f037a7c0ebce5b (patch)
treefe58dffd0a97bfdf924c3bfcfadd2eef3d6614fa
parentb81023a76e479bc417c523905a34266489b55d7f (diff)
changed tblName to an enum; refactored enums into their own file
-rw-r--r--Makefile2
-rw-r--r--dbhandling.c37
-rw-r--r--dbhandling.h8
-rw-r--r--enum.c19
-rw-r--r--enum.h37
-rw-r--r--main.c70
6 files changed, 116 insertions, 57 deletions
diff --git a/Makefile b/Makefile
index ffbf78f..aaf0f79 100644
--- a/Makefile
+++ b/Makefile
@@ -9,7 +9,7 @@ INSTALL_DATA = install -m 644
CFLAGS = -Wall -Wextra
LIBS = -lsqlite3
-SRC = main.c dbhandling.c
+SRC = main.c dbhandling.c enum.c
OBJ = ${SRC:.c=.o}
BIN = libman
diff --git a/dbhandling.c b/dbhandling.c
index 778c147..40ef42c 100644
--- a/dbhandling.c
+++ b/dbhandling.c
@@ -1,4 +1,5 @@
#include "dbhandling.h"
+#include "enum.h"
void exit_with_error(sqlite3 *db, const char *msg)
{
@@ -7,7 +8,7 @@ void exit_with_error(sqlite3 *db, const char *msg)
exit(69);
}
-void select_from_table(sqlite3 *db, char *tblName, char *qp)
+void select_from_table(sqlite3 *db, target_e target, char *qp)
{
char *sql;
int rc;
@@ -18,14 +19,16 @@ void select_from_table(sqlite3 *db, char *tblName, char *qp)
char *query_param = malloc(strlen(qp) + 2);
int id;
-
- if (!strcmp(tblName, "anime")) {
+ switch (target) {
+ case ANIME:
type = "Episode";
sql = "SELECT * FROM anime WHERE NAME LIKE ?1 ORDER BY ID;";
- } else if (!strcmp(tblName, "manga")) {
+ break;
+ case MANGA:
type = "Chapter";
sql = "SELECT * FROM manga WHERE NAME LIKE ?1 ORDER BY ID;";
- } else {
+ break;
+ default:
fprintf(stderr, "table does not exist...\n");
sqlite3_close(db);
exit(69);
@@ -58,7 +61,7 @@ void select_from_table(sqlite3 *db, char *tblName, char *qp)
free(query_param);
}
-void update_entry(sqlite3 *db, char *tblName, char *qp, char *value, char *status)
+void update_entry(sqlite3 *db, target_e target, char *qp, char *value, char *status)
{
char *sql;
int rc;
@@ -66,19 +69,22 @@ void update_entry(sqlite3 *db, char *tblName, char *qp, char *value, char *statu
sqlite3_stmt *stmt;
- if (!strcmp(tblName, "anime")) {
+ switch (target) {
+ case ANIME:
if (status == NULL) {
sql = "UPDATE anime SET EPISODE=?1 WHERE NAME=?2;";
} else {
sql = "UPDATE anime SET EPISODE=?1, STATUS=?2 WHERE NAME=?3;";
}
- } else if (!strcmp(tblName, "manga")) {
+ break;
+ case MANGA:
if (status == NULL) {
sql = "UPDATE manga SET CHAPTER=?1 WHERE NAME=?2;";
} else {
sql = "UPDATE manga SET CHAPTER=?1, STATUS=?2 WHERE NAME=?3;";
}
- } else {
+ break;
+ default:
fprintf(stderr, "table does not exist...\n");
sqlite3_close(db);
exit(69);
@@ -106,18 +112,21 @@ void update_entry(sqlite3 *db, char *tblName, char *qp, char *value, char *statu
sqlite3_finalize(stmt);
}
-void add_entry(sqlite3 *db, char *tblName, char *name, char *value, char *status)
+void add_entry(sqlite3 *db, target_e target, char *name, char *value, char *status)
{
char *sql;
int rc;
sqlite3_stmt *stmt;
- if (!strcmp(tblName, "anime")) {
+ switch (target) {
+ case ANIME:
sql = "INSERT INTO anime (NAME, EPISODE, STATUS) VALUES (?1, ?2, ?3);";
- } else if (!strcmp(tblName, "manga")) {
+ break;
+ case MANGA:
sql = "INSERT INTO manga (NAME, CHAPTER, STATUS) VALUES (?1, ?2, ?3);";
- } else {
+ break;
+ default:
fprintf(stderr, "table does not exist...\n");
sqlite3_close(db);
exit(69);
@@ -133,6 +142,6 @@ void add_entry(sqlite3 *db, char *tblName, char *name, char *value, char *status
sqlite3_bind_text(stmt, 3, status, -1, SQLITE_STATIC);
rc = sqlite3_step(stmt);
- printf("Entry %s added to %s!\n", name, tblName);
+ printf("Entry %s added!\n", name);
sqlite3_finalize(stmt);
}
diff --git a/dbhandling.h b/dbhandling.h
index 4f09852..df54eba 100644
--- a/dbhandling.h
+++ b/dbhandling.h
@@ -7,9 +7,11 @@
#include <unistd.h>
#include <sqlite3.h>
+#include "enum.h"
+
void exit_with_error(sqlite3 *db, const char *msg);
-void select_from_table(sqlite3 *db, char *tblName, char *qp);
-void update_entry(sqlite3 *db, char *tblName, char *qp, char *value, char *status);
-void add_entry(sqlite3 *db, char *tblName, char *name, char *value, char *status);
+void select_from_table(sqlite3 *db, target_e target, char *qp);
+void update_entry(sqlite3 *db, target_e target, char *qp, char *value, char *status);
+void add_entry(sqlite3 *db, target_e target, char *name, char *value, char *status);
#endif
diff --git a/enum.c b/enum.c
new file mode 100644
index 0000000..34eeead
--- /dev/null
+++ b/enum.c
@@ -0,0 +1,19 @@
+#include "enum.h"
+
+mode_e str2enum_mode(const char *str)
+{
+ for (size_t i = 0; i < sizeof(conversion_mode) / sizeof(conversion_mode[0]); ++i) {
+ if (!strcmp(str, conversion_mode[i].str))
+ return conversion_mode[i].val;
+ }
+ return -1;
+}
+
+target_e str2enum_target(const char *str)
+{
+ for (size_t i = 0; i < sizeof(conversion_target) / sizeof(conversion_target[0]); ++i) {
+ if (!strcmp(str, conversion_target[i].str))
+ return conversion_target[i].val;
+ }
+ return -1;
+}
diff --git a/enum.h b/enum.h
new file mode 100644
index 0000000..68bbc99
--- /dev/null
+++ b/enum.h
@@ -0,0 +1,37 @@
+#ifndef _ENUM_
+#define _ENUM_
+
+#include <string.h>
+
+typedef enum {
+ ANIME,
+ MANGA,
+} target_e;
+
+typedef enum {
+ GET,
+ SET,
+ ADD,
+} mode_e;
+
+static const struct {
+ mode_e val;
+ const char *str;
+} conversion_mode [] = {
+ {GET, "get"},
+ {SET, "set"},
+ {ADD, "add"},
+};
+
+static const struct {
+ target_e val;
+ const char *str;
+} conversion_target [] = {
+ {ANIME, "anime"},
+ {MANGA, "manga"},
+};
+
+mode_e str2enum_mode(const char *str);
+target_e str2enum_target(const char *str);
+
+#endif
diff --git a/main.c b/main.c
index b38733b..c67a976 100644
--- a/main.c
+++ b/main.c
@@ -1,34 +1,19 @@
#include <stdint.h>
#include "dbhandling.h"
+#include "enum.h"
const uint8_t PATH_MAX = 64;
const char *filepath = ".local/share/sqlite";
const char *filename = "library.db";
-typedef enum {
- GET,
- SET,
- ADD,
-} mode_e;
-
-static const struct {
- mode_e val;
- const char *str;
-} conversion [] = {
- {GET, "get"},
- {SET, "set"},
- {ADD, "add"},
-};
-
-mode_e str2enum(const char *str)
-{
- for (size_t i = 0; i < sizeof(conversion) / sizeof(conversion[0]); ++i) {
- if (!strcmp(str, conversion[i].str))
- return conversion[i].val;
- }
- return -1;
-}
+typedef struct {
+ target_e target;
+ char *name;
+ char *author;
+ char *value;
+ char *status;
+} entry_t;
void print_help(void)
{
@@ -43,6 +28,20 @@ void print_help(void)
printf("\n");
}
+entry_t *set_entry(entry_t *entry, int argc, char **argv)
+{
+ entry->target = str2enum_target(argv[2]);
+ entry->name = argv[3];
+ if (argc == 5) {
+ entry->value = argv[4];
+ entry->status = NULL;
+ } else if (argc == 6) {
+ entry->value = argv[4];
+ entry->status = argv[5];
+ }
+ return entry;
+}
+
int main(int argc, char **argv)
{
if (argc < 4) {
@@ -52,10 +51,8 @@ int main(int argc, char **argv)
}
mode_e mode;
- char *target, *name, *value, *status;
- mode = str2enum(argv[1]);
- target = argv[2];
- name = argv[3];
+ entry_t *entry = malloc(sizeof(entry_t));
+ mode = str2enum_mode(argv[1]);
char fullpath[PATH_MAX];
snprintf(fullpath, PATH_MAX, "%s/%s/%s", getenv("HOME"), filepath, filename);
@@ -71,7 +68,8 @@ int main(int argc, char **argv)
switch (mode) {
case GET:
- select_from_table(db, target, name);
+ set_entry(entry, argc, argv);
+ select_from_table(db, entry->target, entry->name);
break;
case SET:
if (argc < 5) {
@@ -79,14 +77,8 @@ int main(int argc, char **argv)
sqlite3_close(db);
exit(69);
}
- if (argc == 5) {
- value = argv[4];
- update_entry(db, target, name, value, NULL);
- } else if (argc == 6) {
- value = argv[4];
- status = argv[5];
- update_entry(db, target, name, value, status);
- }
+ set_entry(entry, argc, argv);
+ update_entry(db, entry->target, entry->name, entry->value, entry->status);
break;
case ADD:
if (argc < 6) {
@@ -94,9 +86,8 @@ int main(int argc, char **argv)
sqlite3_close(db);
exit(69);
}
- value = argv[4];
- status = argv[5];
- add_entry(db, target, name, value, status);
+ set_entry(entry, argc, argv);
+ add_entry(db, entry->target, entry->name, entry->value, entry->status);
break;
default:
fprintf(stderr, "unknown option...\n");
@@ -106,5 +97,6 @@ int main(int argc, char **argv)
}
sqlite3_close(db);
+ free(entry);
return 0;
}