aboutsummaryrefslogtreecommitdiff
path: root/db.c
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2017-03-14 13:39:51 +0100
committertomsmeding <tom.smeding@gmail.com>2017-03-14 13:41:02 +0100
commit230e9775f5b61e21aa085825fbbd0232e9a360ef (patch)
tree566ffe84fa4b57e0f77cd40f1de343669750d5ab /db.c
parent54064158d84fc4006e651deb314cde156cc383e8 (diff)
Room listing and creation
Diffstat (limited to 'db.c')
-rw-r--r--db.c107
1 files changed, 106 insertions, 1 deletions
diff --git a/db.c b/db.c
index 3b7a61b..1997c5a 100644
--- a/db.c
+++ b/db.c
@@ -1,4 +1,6 @@
+#include <stdlib.h>
#include <string.h>
+#include <assert.h>
#include <sqlite3.h>
#include "db.h"
#include "schema.sql.h"
@@ -29,6 +31,82 @@ void db_close(void){
}
+static char* gen_room_name(void){
+ const int name_len=8;
+ const char *alphabet="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ const int alpha_len=strlen(alphabet);
+
+ char *name=malloc(name_len+1,char);
+ for(int i=0;i<name_len;i++){
+ name[i]=alphabet[random()%alpha_len];
+ }
+ name[name_len]='\0';
+ debug("Generated name: %s",name);
+ return name;
+}
+
+struct db_name_id db_create_room(void){
+ char *name=gen_room_name();
+
+ sqlite3_stmt *stmt;
+ SQLITE(prepare_v2,database,"insert into Rooms (name) values (?)",-1,&stmt,NULL);
+ SQLITE(bind_text,stmt,1,name,-1,SQLITE_STATIC);
+ bool success=sqlite3_step(stmt)==SQLITE_DONE;
+ SQLITE(finalize,stmt);
+
+ i64 userid=sqlite3_last_insert_rowid(database);
+
+ if(!success){
+ free(name);
+ return (struct db_name_id){NULL,-1};
+ }
+
+ return (struct db_name_id){name,userid};
+}
+
+bool db_add_member(i64 roomid,i64 userid){
+ assert(roomid!=-1&&userid!=-1);
+ sqlite3_stmt *stmt;
+ SQLITE(prepare_v2,database,"insert into Members (room, user) values (?, ?)",-1,&stmt,NULL);
+ SQLITE(bind_int64,stmt,1,roomid);
+ SQLITE(bind_int64,stmt,2,userid);
+ bool success=sqlite3_step(stmt)==SQLITE_DONE;
+ SQLITE(finalize,stmt);
+ return success;
+}
+
+struct db_room_list db_list_rooms(i64 userid){
+ sqlite3_stmt *stmt;
+ SQLITE(prepare_v2,database,
+ "select M.room, R.name "
+ "from Members as M, Rooms as R "
+ "where M.user = ? and M.room = R.id"
+ ,-1,&stmt,NULL);
+ SQLITE(bind_int64,stmt,1,userid);
+
+ struct db_room_list rl;
+ i64 cap=4;
+ rl.count=0;
+ rl.list=malloc(cap,struct db_name_id);
+
+ int ret;
+ while((ret=sqlite3_step(stmt))==SQLITE_ROW){
+ if(rl.count==cap){
+ cap*=2;
+ rl.list=realloc(rl.list,cap,struct db_name_id);
+ }
+ rl.list[rl.count].id=sqlite3_column_int64(stmt,0);
+ rl.list[rl.count].name=strdup((const char*)sqlite3_column_text(stmt,1));
+ rl.count++;
+ }
+
+ if(ret!=SQLITE_DONE)die_sqlite("sqlite3_step");
+ SQLITE(finalize,stmt);
+
+ return rl;
+}
+
+
i64 db_create_user(const char *name,const char *pass){
sqlite3_stmt *stmt;
SQLITE(prepare_v2,database,"insert into Users (username, pass) values (?, ?)",-1,&stmt,NULL);
@@ -48,14 +126,41 @@ i64 db_create_user(const char *name,const char *pass){
return userid;
}
+char* db_get_pass(i64 userid){
+ sqlite3_stmt *stmt;
+ SQLITE(prepare_v2,database,"select pass from Users where id = ?",-1,&stmt,NULL);
+ SQLITE(bind_int64,stmt,1,userid);
+ const unsigned char *pass_sq=NULL;
+ if(sqlite3_step(stmt)==SQLITE_ROW){
+ pass_sq=sqlite3_column_text(stmt,0);
+ }
+ char *pass=NULL;
+ if(pass_sq)pass=strdup((const char*)pass_sq);
+ SQLITE(finalize,stmt);
+ return pass;
+}
+
i64 db_find_user(const char *name){
sqlite3_stmt *stmt;
SQLITE(prepare_v2,database,"select user from UserNames where name = ?",-1,&stmt,NULL);
SQLITE(bind_text,stmt,1,name,-1,SQLITE_STATIC);
i64 userid=-1;
if(sqlite3_step(stmt)==SQLITE_ROW){
- userid=sqlite3_column_int64(stmt,1);
+ userid=sqlite3_column_int64(stmt,0);
}
SQLITE(finalize,stmt);
return userid;
}
+
+
+void db_nullify_name_id(struct db_name_id ni){
+ if(ni.name)free(ni.name);
+}
+
+void db_nullify_room_list(struct db_room_list rl){
+ for(i64 i=0;i<rl.count;i++){
+ free(rl.list[i].name);
+ }
+ if(rl.list)free(rl.list);
+ rl.list=NULL;
+}