From bb57317f22b94970d78a97915763b0dbe1d7742d Mon Sep 17 00:00:00 2001 From: FreeArtMan Date: Sun, 29 Oct 2017 15:44:42 +0000 Subject: Make rpc and todo command working, with sqlite shitz --- Makefile | 2 +- agni.c | 31 +++++++++- cmd/cmd_todo.c | 181 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- cmd/cmd_todo.h | 3 + nbrpc_call.c | 2 +- nbrpc_event.c | 18 ++++++ tbl_qcmd.c | 3 +- 7 files changed, 232 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 20f8c80..d68056c 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ CC=gcc CFLAGS=-g3 -Wall SOURCES=$(wildcard *.c) OBJECTS=$(SOURCES:.c=.o) -LDFLAGS=-lrt -lm +LDFLAGS=-lrt -lm -lsqlite3 INCLUDE=-I./extlibs/ -I./ all: createcmd createextlib $(OBJECTS) $(PROJECT) diff --git a/agni.c b/agni.c index 891261b..520ef45 100644 --- a/agni.c +++ b/agni.c @@ -133,6 +133,33 @@ tble_cmd_resp* cllbk_wrapper( void *(*call)(void *), tble_cmd_param *param) return resp; } +/* +convert irc ident to 3 newly alocated string +*/ +int irciedent_parse(char *ident, rpc_request *req) +{ + int count1, count2; + sds params1 = sdsnew(ident), params2; + sds *tokens1, *tokens2; + + tokens1 = sdssplitlen(params1, sdslen(params1), "!", 1, &count1); + + req->user = alloc_new_str(tokens1[0]); + + params2 = sdsnew(tokens1[1]); + tokens2 = sdssplitlen(params2, sdslen(params2), "@", 1, &count2); + + req->mask = alloc_new_str(tokens2[0]); + req->server = alloc_new_str(tokens2[1]); + + sdsfree(params1); + sdsfree(params2); + sdsfreesplitres(tokens1, count1); + sdsfreesplitres(tokens2, count2); + + return 0; +} + /* return unique ID, with atomic counter should work in all cases */ @@ -556,9 +583,7 @@ int th_start_client(void *data) } req = rpc_req_new(qcmd->cmd, qcmd->param, qcmd->cid); - req->user = alloc_new_str("U-ser"); - req->mask = alloc_new_str("M-ask"); - req->server = alloc_new_str("S-erver"); + irciedent_parse(qcmd->ircident, req); rpc_req_marsh(req, &nb_req); buf_nb = nb_create(nb_req); diff --git a/cmd/cmd_todo.c b/cmd/cmd_todo.c index 2b3993b..50218b0 100644 --- a/cmd/cmd_todo.c +++ b/cmd/cmd_todo.c @@ -1,10 +1,105 @@ #include "cmd_todo.h" +static int add_todo(sqlite3 *db, char *user, char *todo) +{ + int rc; + + char sql_add_table[1024]; + snprintf(sql_add_table, 1024, "INSERT INTO todo(user,todo) VALUES('%s','%s');", user, todo); + printf("%s\n", sql_add_table); + + 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; imethod, req->params, req->user, req->mask, req->server); + PRINT("(%s)-(%s)-(%s)-(%s)-(%s)\n", req->method, req->params, req->user, req->mask, req->server); + + if ((rc = sqlite3_open("todo.db", &db)) != SQLITE_OK) + { + printf("Cannot open todo database: %s\n", sqlite3_errmsg(db)); + sqlite3_close(db); + + return 1; + } + + //check if table excists + char *sql_check_table = "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='todo'"; + if ((rc = sqlite3_prepare_v2(db, sql_check_table, -1, &res, 0)) != SQLITE_OK) + { + printf("Cannot prepare statment: %s\n", sqlite3_errmsg(db)); + sqlite3_close(db); + return 1; + } + + rc = sqlite3_step(res); + if (rc == SQLITE_ROW) + { + int iret = sqlite3_column_int(res, 0); + //printf("%d\n", iret); + if (iret == 0) + { + table_todo_exists = 0; + } else + { + table_todo_exists = 1; + } + } + + //if table doesnt excists then create new one + if (table_todo_exists == 0) + { + char *sql_create_table = "CREATE TABLE todo(id INTEGER PRIMARY KEY AUTOINCREMENT, user TEXT, todo TEXT)"; + if ((rc = sqlite3_exec(db, sql_create_table, 0, 0, &err_msg)) != SQLITE_OK) + { + printf("Cant create table: %s\n", err_msg); + sqlite3_free(err_msg); + sqlite3_close(db); + } + } + + params = sdsnew(req->params); + tokens = sdssplitargs(params, &count); + if (strncmp(tokens[1],"add",3) == 0) + { + PRINT("ADD\n"); + if (count > 2) + { + sds sAdd = sdsempty(); + for (i=2;iuser, sAdd); + } + } else if (strncmp(tokens[1],"del",3) == 0) + { + PRINT("DEL\n"); + if (count > 2) + { + int id = atoi(tokens[2]); + del_todo(db, req->user, id); + } + + } else if (strncmp(tokens[1],"list",4) == 0) + { + PRINT("LIST\n"); + list_todo(db, req->user, &out_todo); + PRINT("%s\n",out_todo); + out_result = sdscatsds(out_result, out_todo); + out_result[sdslen(out_result)-1] = 0; //dirty hack mate + sdsfree(out_todo); + } else + { + + } + sqlite3_finalize(res); + sqlite3_close(db); //---------------------------------------------------------------------------- //prepare response @@ -51,7 +228,7 @@ void *cmd_todo(void *data) nb_init(nb_resp); PNL(); - resp = rpc_call_resp_new("Success","None",1); + resp = rpc_call_resp_new(out_result,"None",1); resp->user = alloc_new_str(" "); resp->server = alloc_new_str(" "); resp->mask = alloc_new_str(" "); diff --git a/cmd/cmd_todo.h b/cmd/cmd_todo.h index 1e436ba..210529e 100644 --- a/cmd/cmd_todo.h +++ b/cmd/cmd_todo.h @@ -9,9 +9,12 @@ #include #include +#include + #include "util.h" #include "debug.h" #include "nbrpc_call.h" +#include "sds.h" void *cmd_todo(void *data); diff --git a/nbrpc_call.c b/nbrpc_call.c index 67242a9..b261cfb 100644 --- a/nbrpc_call.c +++ b/nbrpc_call.c @@ -108,7 +108,7 @@ int rpc_call_req_marsh( rpc_call_request *req, netbyte_store **nb_req) nb_add_u8arr(nb, &nb_user); nb_u8arr_create(&nb_mask, strlen(req->mask), (uint8_t *)req->mask); - nb_add_u8arr(nb, &nb_params); + nb_add_u8arr(nb, &nb_mask); nb_u8arr_create(&nb_server, strlen(req->server), (uint8_t *)req->server); nb_add_u8arr(nb, &nb_server); diff --git a/nbrpc_event.c b/nbrpc_event.c index 85e4aab..d830e5d 100644 --- a/nbrpc_event.c +++ b/nbrpc_event.c @@ -173,6 +173,9 @@ int rpc_req_unmarsh( netbyte_store *nb_req, rpc_request **req) { ENL(); } + } else + { + ENL(); } if (0 == nb_val(nb_req, 1, &type)) @@ -185,6 +188,9 @@ int rpc_req_unmarsh( netbyte_store *nb_req, rpc_request **req) { ENL(); } + } else + { + ENL(); } if (0 == nb_val(nb_req, 2, &type)) @@ -198,6 +204,9 @@ int rpc_req_unmarsh( netbyte_store *nb_req, rpc_request **req) { ENL(); } + } else + { + ENL(); } //user @@ -212,6 +221,9 @@ int rpc_req_unmarsh( netbyte_store *nb_req, rpc_request **req) { ENL(); } + } else + { + ENL(); } //mask @@ -226,6 +238,9 @@ int rpc_req_unmarsh( netbyte_store *nb_req, rpc_request **req) { ENL(); } + } else + { + ENL(); } //server @@ -240,6 +255,9 @@ int rpc_req_unmarsh( netbyte_store *nb_req, rpc_request **req) { ENL(); } + } else + { + ENL(); } *req = __req; diff --git a/tbl_qcmd.c b/tbl_qcmd.c index d8bfc79..4db8344 100644 --- a/tbl_qcmd.c +++ b/tbl_qcmd.c @@ -162,10 +162,11 @@ int tbl_exec_run(tbl_exec *tbl, char *cmd, char *user, char *mask, char *server, if (mask != NULL) { PRINT("%s mask\n", mask); - req->mask = alloc_new_str("asd!!"); + req->mask = alloc_new_str(mask); } if (server != NULL) { + PRINT("%s server\n", server); req->server = alloc_new_str(server); } rpc_call_req_marsh(req, &nb_req); -- cgit v1.2.3