#include "cmd_todo.h"
//https://github.com/littlstar/b64.c
//https://www.google.nl/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cad=rja&uact=8&ved=0ahUKEwiMu9_F5ZrXAhVLOMAKHZ6NDQYQFghDMAM&url=https%3A%2F%2Fopensource.apple.com%2Fsource%2FQuickTimeStreamingServer%2FQuickTimeStreamingServer-452%2FCommonUtilitiesLib%2Fbase64.c&usg=AOvVaw3tk0M33ne4ru28Bn_R1KI3
#define TODO_MAX_PER_USER 64
#define TODO_MAX_DB_FILE_SIZE (1024*1024)
#define TODO_DB_NAME "todo.db"
static int add_todo(sqlite3 *db, char *user, char *todo)
{
int rc;
char sql_add_table[3*256];
char *b64_user, *b64_todo;
sqlite3_stmt *res=NULL;
b64_user = b64_encode((unsigned char *)user, strlen(user));
b64_todo = b64_encode((unsigned char *)todo, strlen(todo));
//check how many todo stuff is for single user
snprintf(sql_add_table, 1024, "SELECT COUNT(*) FROM todo WHERE user='%s';", b64_user);
printf("%s\n", sql_add_table);
if ((rc = sqlite3_prepare_v2(db, sql_add_table, -1, &res, 0)) != SQLITE_OK)
{
printf("Cannot prepare statment: %s\n", sqlite3_errmsg(db));
free(b64_user);
free(b64_todo);
return -1;
}
rc = sqlite3_step(res);
if (rc == SQLITE_ROW)
{
int iret = sqlite3_column_int(res, 0);
PRINT("%d\n",iret);
if (iret >= TODO_MAX_PER_USER)
{
free(b64_user);
free(b64_todo);
return -1;
}
}
sqlite3_finalize(res);
//insert new value
snprintf(sql_add_table, 1024, "INSERT INTO todo(user,todo) VALUES('%s','%s');", b64_user, b64_todo);
printf("%s\n", sql_add_table);
free(b64_user);
free(b64_todo);
if ((rc = sqlite3_exec(db, sql_add_table, 0, 0, 0)) != SQLITE_OK)
{
printf("Cannot prepare statment: %s\n", sqlite3_errmsg(db));
return -1;
}
return 0;
}
static int cb_list_todo_table(void *param1, int argc, char **argv, char **cname)
{
int i;
sds *out = (sds *)param1;
//sds local_out = sdsempty();
for (i=0; i<argc; i++)
{
printf("%s = %s, ", cname[i], argv[i] ? argv[i] : "NULL");
if (strncmp(cname[i],"id",2) == 0)
{
*out = sdscat(*out, argv[i]);
*out = sdscat(*out, " - ");
} else if (strncmp(cname[i],"todo",4) == 0)
{
char *b64_todo = (char *)b64_decode(argv[i], strlen(argv[i]));
*out = sdscat(*out, b64_todo);
free(b64_todo);
*out = sdscat(*out, "\n");
}
}
printf("\n");
return 0;
}
static int list_todo(sqlite3 *db, char *user, sds *out)
{
int rc;
char *err_msg = NULL;
char sql_list_table[1024];
char *b64_user;
b64_user = b64_encode((unsigned char *)user, strlen(user));
snprintf(sql_list_table, 1024, "SELECT * FROM todo WHERE user='%s'", b64_user);
printf("%s\n",sql_list_table);
free(b64_user);
if ((rc = sqlite3_exec(db, sql_list_table, cb_list_todo_table, out, &err_msg )) != SQLITE_OK)
{
printf("Cant list todo: %s\n", err_msg);
sqlite3_free(err_msg);
return -1;
}
return 0;
}
static int list_total(sqlite3 *db, sds *out)
{
int rc;
sqlite3_stmt *res=NULL;
char sql_list_total[1024];
snprintf(sql_list_total, 1024, "SELECT COUNT(*) FROM todo;");
printf("%s\n",sql_list_total);
if ((rc = sqlite3_prepare_v2(db, sql_list_total, -1, &res, 0)) != SQLITE_OK)
{
printf("Cannot prepare statment: %s\n", sqlite3_errmsg(db));
return -1;
}
rc = sqlite3_step(res);
if (rc == SQLITE_ROW)
{
const char *cret = (char *)sqlite3_column_text(res, 0);
*out