From 2298c4aaf779af2abfa4e7484e7418adc354b44b Mon Sep 17 00:00:00 2001 From: Huck Boles Date: Sat, 31 Dec 2022 00:00:17 -0600 Subject: [PATCH] Sat Dec 31 12:00:17 AM CST 2022 automatic backup --- actions.c | 85 +++++++++++++++++++++++++++++++++++++ database.c | 56 +++++++++++++++--------- function.c | 59 ++++++++++++++++++++++++++ odot.c | 122 ++++++++++++----------------------------------------- odot.h | 21 ++++++--- 5 files changed, 221 insertions(+), 122 deletions(-) create mode 100644 actions.c create mode 100644 function.c diff --git a/actions.c b/actions.c new file mode 100644 index 0000000..8fab80d --- /dev/null +++ b/actions.c @@ -0,0 +1,85 @@ +#include "odot.h" + +extern char *task, + *group, + *newgroup; + +extern u_long hash; + +extern int exists,showall,showdone; + +void newtask(sqlite3 *db){ + char *cmd = malloc(MAXLINE*sizeof(char)); + + sprintf(cmd,"%s '%s';",GETTASK,task); + sqlcmd(db,cmd,'c'); + + if (exists == 0){ + sprintf(cmd,"%s (%lu, '%s', '%s', 0);",INSERT,hash,task,group); + sqlcmd(db,cmd,'q'); + } + return; +} + +void done(sqlite3 *db){ + char *cmd = malloc(MAXLINE*sizeof(char)); + + sprintf(cmd,"%s '%s';",GETTASK,task); + sqlcmd(db,cmd,'c'); + + + if (exists == 1) { + sprintf(cmd,"%s %lu;",DONE,hash); + sqlcmd(db,cmd,'q'); + + sprintf(cmd,"%s %lu;", GETTASK,hash); + sqlcmd(db,cmd,'t'); + + sprintf(cmd,"SELECT Done, Task FROM Tasks WHERE Hash = %lu",hash); + printf("\n"); + sqlcmd(db,cmd,'p'); + } + return; +} + +void update(sqlite3 *db){ + +} + +void removetask(sqlite3 *db){ + char *cmd = malloc(MAXLINE*sizeof(char)); + + sprintf(cmd,"%s '%s';",GETTASK,task); + sqlcmd(db,cmd,'c'); + + if (exists == 1){ + sprintf(cmd,"%s %lu;",DELETE,hash); + sqlcmd(db,cmd,'c'); + } + return; +} + +void show(sqlite3 *db){ + char *cmd = malloc(MAXLINE*sizeof(char)); + int mask = showall + (showdone << 1); + + printf("\n\t\033[35;1mTODO\033[0m: \033[36m%s\033[0m\n\n",group); + + switch (mask) { + case 0: + sprintf(cmd,"%s '%s';",PRINTGROUP,group); + sqlcmd(db,cmd,'p'); + break; + case 1: + sqlcmd(db,PRINT,'p'); + break; + case 2: + sprintf(cmd,"%s '%s' ORDER BY Done;",PRINTGROUPALL,group); + sqlcmd(db,cmd,'p'); + break; + case 3: + sqlcmd(db,PRINTALL,'p'); + break; + } + return; +} diff --git a/database.c b/database.c index 76ba218..3490f13 100644 --- a/database.c +++ b/database.c @@ -1,8 +1,11 @@ #include "odot.h" extern char *group, + *newgroup, *task; +extern u_long hash; +extern int exists; sqlite3 *accessdb(char *file){ sqlite3 *db; @@ -13,28 +16,26 @@ sqlite3 *accessdb(char *file){ return db; } -void sqlcmd(sqlite3 *db, char *cmd){ - int err = sqlite3_exec(db,cmd,NULL,NULL,NULL); - if (err) sqlerror(db); - return; - -} - -void sqlprint(sqlite3 *db, char *cmd){ - int err = sqlite3_exec(db,cmd,printcallback,0,NULL); - if (err) sqlerror(db); - return; - -} - -void sqlgroup(sqlite3 *db, char *cmd){ - int err = sqlite3_exec(db,cmd,groupcallback,0,NULL); +void sqlcmd(sqlite3 *db, char *cmd, char action){ + int err; + switch (action) { + case 'q': + err = sqlite3_exec(db,cmd,NULL,NULL,NULL); + break; + case 'p': + err = sqlite3_exec(db,cmd,printcallback,0,NULL); + break; + case 't': + err = sqlite3_exec(db,cmd,taskcallback,0,NULL); + break; + case 'c': + err = sqlite3_exec(db,cmd,taskcallback,0,NULL); + break; + } if (err) sqlerror(db); return; - } - void sqlerror(sqlite3 *db) { fprintf(stderr, "%s\n", sqlite3_errmsg(db)); sqlite3_close(db); @@ -43,7 +44,8 @@ void sqlerror(sqlite3 *db) { int printcallback(void *unused,int argc, char **argv, char **name){ int i = 1; - + + /* print group if it changes */ if (argv[2]){ char *g = malloc(strlen(argv[1])*sizeof(char)); sprintf(g,"%s",argv[1]); @@ -59,7 +61,19 @@ int printcallback(void *unused,int argc, char **argv, char **name){ return 0; } -int groupcallback(void *unused,int argc, char **argv, char **name){ - strcpy(group,argv[0]); +int taskcallback(void *unused,int argc, char **argv, char **name){ + sprintf(task,"%s",argv[0]); + sprintf(group,"%s",argv[1]); + hash = strtoul(argv[2],NULL,10); + return 0; +} + +int checkcallback(void *unused,int argc, char **argv, char **name){ + if (exists == 1) return 0; + if (hash == strtoul(argv[2],NULL,10)) { + exists = 1; + } else if (strcmp(task,argv[0]) == 0) { + checksame(task,argv[1]); + } return 0; } diff --git a/function.c b/function.c new file mode 100644 index 0000000..ebdaf69 --- /dev/null +++ b/function.c @@ -0,0 +1,59 @@ +#include "odot.h" + +extern char *group, + *newgroup, + *task, + *action; + +extern u_long hash; + +extern int exists; + +u_long genhash(void){ + char *tmp = malloc((strlen(task)+strlen(group)+1) * sizeof(char)); + strcat(tmp,task); + strcat(tmp,group); + int h = 11235813; + + while (*tmp++) h = (~(h << 5) ^ *tmp); + return h; +} + +char *filepath(void){ + char *dir = getenv("XDG_DATA_HOME"); + char *db = malloc(MAXLINE * sizeof(char)); + + /* set dir to $HOME/.local/share if XDG isn't set */ + if (!dir) { + dir = getenv("HOME"); + if (!dir) error(3); + strcat(dir,"/.local/share"); + } + strcat(dir,"/odot"); + + DIR *test = opendir(dir); + + /* test if dir exists and create if it doesn't */ + if (test) { + closedir(test); + } else { + int err = mkdir(dir, 0777); + if (err) error(2); + } + + strcat(db,dir); + + return db; +} + +void checksame(char *task,char *oldgroup){ + printf("\033[32m%s\033[0m already exists, but in \033[34m%s\033[0m\nIs this the same task? [y/\033[1mn\033[0m] ",task,oldgroup); + + if (getchar() == 'y'){ + exists = 1; + strcpy(group,oldgroup); + hash = genhash(); + } + + return; +} diff --git a/odot.c b/odot.c index 3b81899..149bb1f 100644 --- a/odot.c +++ b/odot.c @@ -2,9 +2,10 @@ /* global variables */ int showdone = 0, - showall = 0; + showall = 0, + exists = 0; -u_int hash; +u_long hash; char *group, *newgroup, @@ -12,16 +13,25 @@ char *group, *action; int main(int argc, char *argv[]){ - if (argc == 1) help(); + /* show help if no arguments unless its just showing tasks */ + if (argc == 2 && strcmp(argv[1],"show") != 0) help(); sqlite3 *db; - db = accessdb(filepath()); - sqlcmd(db,BUILDTABLE); - + int err = sqlite3_open(filepath(),&db); + sqlcmd(db,BUILDTABLE,'c'); + + /* show all tasks if called alone */ + if (argc == 1) { + showall = 1; + show(db); + sqlite3_close(db); + exit(0); + } group = calloc(MAXLINE,sizeof(char)); task = calloc(MAXLINE,sizeof(char)); action = calloc(MAXLINE,sizeof(char)); + newgroup = calloc(MAXLINE,sizeof(char)); parseopt(argc,argv); hash = genhash(); @@ -34,7 +44,7 @@ int main(int argc, char *argv[]){ void parseopt(int n, char **args){ char c; - while ((c = getopt(n,args,"g:adh")) != -1){ + while ((c = getopt(n,args,"g:G:adh")) != -1){ switch (c) { case 'h': help(); @@ -46,108 +56,27 @@ void parseopt(int n, char **args){ showdone = 1; break; case 'g': - sprintf(group,"%s",optarg); + strcpy(group,optarg); break; case 'G': - sprintf(newgroup,"%s",optarg); + strcpy(newgroup,optarg); break; case '?': - printf("Unknown Option: %c\n", optopt); + error(4); + break; } } - sprintf(action,"%s",args[optind]); + /* get subcommand */ + strcpy(action,args[optind]); + /* rest of arguments become task */ for (int j = optind + 1; j < n; j++){ strcat(task,args[j]); strcat(task,(j != n-1) ? " " : ""); } } -void operate(sqlite3 *db){ - char *cmd = malloc(MAXLINE*sizeof(char)); - - if (strcmp(action,"new") == 0){ - sprintf(cmd,"%s (%ui, '%s', '%s', 0);",INSERT,hash,task,group); - sqlcmd(db,cmd); - } else if (strcmp(action,"done") == 0){ - sprintf(cmd,"%s %ui;",DONE,hash); - sqlcmd(db,cmd); - - sprintf(cmd,"%s %ui;", GETGROUP,hash); - sqlgroup(db,cmd); - - sprintf(cmd,"SELECT Done, Task FROM Tasks WHERE Hash = %ui",hash); - printf("\n"); - sqlprint(db,cmd); - } else if (strcmp(action,"remove") == 0){ - sprintf(cmd,"%s %ui;",DELETE,hash); - sqlcmd(db,cmd); - } else if (strcmp(action,"update") == 0){ - sprintf(cmd,"%s '%s' WHERE Hash = %ui;",CHANGEGROUP,newgroup,hash); - sqlcmd(db,cmd); - } else if (strcmp(action,"show") != 0) { - fprintf(stderr,"\033[33;1mUnknown subcommand\033[0m: %s\n",action); - } - - printf("\n\t\033[35;1mTODO\033[0m: \033[36m%s\033[0m\n\n",group); - if (showdone < 1) { - sqlprint(db,PRINT); - } - - if (showall == 1) { - if (showdone == 1) { - sqlprint(db,PRINTALL); - } else { - sqlprint(db,PRINT); - } - } else { - if (showdone == 1) { - sprintf(cmd,"%s '%s' ORDER BY Done;",PRINTGROUPALL,group); - sqlprint(db,cmd); - } else if (strcmp(group,"") != 0) { - sprintf(cmd,"%s '%s';",PRINTGROUP,group); - sqlprint(db,cmd); - } else { - sqlprint(db,PRINT); - } - } -} - -u_int genhash(void){ - char *tmp = malloc((strlen(task)+strlen(group)) * sizeof(char)); - sprintf(tmp,"%s%s",task,group); - int h = 11235813; - - while (*tmp++) h = (~(h << 5) ^ *tmp); - return h; -} - -char *filepath(void){ - char *dir = getenv("XDG_DATA_HOME"); - char *db = malloc(MAXLINE * sizeof(char)); - - if (!dir) { - dir = getenv("HOME"); - if (!dir) error(3); - strcat(dir,"/.local/share"); - } - strcat(dir,"/odot"); - - DIR *test = opendir(dir); - - if (test) { - closedir(test); - } else { - int err = mkdir(dir, 0777); - if (err) error(2); - } - - sprintf(db,"%s/odot.db",dir); - - return db; -} - void error(int err){ switch (err) { case 1: @@ -159,6 +88,9 @@ void error(int err){ case 3: fprintf(stderr,"Could not determine $HOME\n"); break; + case 4: + fprintf(stderr,"Unknown Command\n"); + help(); } exit(err); } diff --git a/odot.h b/odot.h index 44761dd..3b4a610 100644 --- a/odot.h +++ b/odot.h @@ -16,25 +16,34 @@ #define INSERT "INSERT INTO Tasks VALUES" #define DELETE "DELETE FROM Tasks WHERE Hash =" #define DONE "UPDATE Tasks SET Done = 1 WHERE Hash =" -#define GETGROUP "SELECT Type FROM Tasks WHERE Hash =" +#define GETTASK "SELECT Task, Type, Hash FROM Tasks WHERE Task =" #define CHANGEGROUP "UPDATE Tasks SET Group =" #define PRINT "SELECT Done, Type, Task FROM Tasks WHERE Done = 0 ORDER BY Type;" #define PRINTALL "SELECT Done, Type, Task FROM Tasks ORDER BY Type;" #define PRINTGROUP "SELECT Done, Task FROM Tasks WHERE Done = 0 AND Type =" #define PRINTGROUPALL "SELECT Done, Task FROM Tasks WHERE Type =" -char *filepath(void); void error(int); void help(void); void parseopt(int, char**); void operate(sqlite3 *); -u_int genhash(void); + +/* action.c */ +void newtask(sqlite3 *); +void done(sqlite3 *); +void update(sqlite3 *); +void removetask(sqlite3 *); +void show(sqlite3 *); + +/* function.c */ +char *filepath(void); +u_long genhash(void); +void checksame(char *,char *); /* functions for interfacing with database: database.c */ sqlite3 *accessdb(char *); -void sqlcmd(sqlite3 *,char *); -void sqlprint(sqlite3 *,char *); -void sqlgroup(sqlite3 *,char *); +void sqlcmd(sqlite3 *,char *,char); void sqlerror(sqlite3 *); int printcallback(void *,int,char **,char **); int groupcallback(void *,int,char **,char **); +int taskcallback(void *,int,char **,char **); -- 2.44.2