diff options
Diffstat (limited to 'db.c')
-rw-r--r-- | db.c | 107 |
1 files changed, 106 insertions, 1 deletions
@@ -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; +} |