--- /dev/null
+#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;
+}
#include "odot.h"
extern char *group,
+ *newgroup,
*task;
+extern u_long hash;
+extern int exists;
sqlite3 *accessdb(char *file){
sqlite3 *db;
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);
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]);
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;
}
--- /dev/null
+#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;
+}
/* global variables */
int showdone = 0,
- showall = 0;
+ showall = 0,
+ exists = 0;
-u_int hash;
+u_long hash;
char *group,
*newgroup,
*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();
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();
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:
case 3:
fprintf(stderr,"Could not determine $HOME\n");
break;
+ case 4:
+ fprintf(stderr,"Unknown Command\n");
+ help();
}
exit(err);
}
#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 **);