aboutsummaryrefslogtreecommitdiff
path: root/db.c
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2017-03-17 19:57:12 +0100
committertomsmeding <tom.smeding@gmail.com>2017-03-17 19:57:12 +0100
commitadd6b39aece179a0e0ad425af72b8a043a0d3188 (patch)
tree0c64d959587f46d8d43471f9939a1847e32ce02d /db.c
parent9a82f91be11a5698c6f0da4dce665e081f3637d0 (diff)
History querying
Diffstat (limited to 'db.c')
-rw-r--r--db.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/db.c b/db.c
index f89e628..983080f 100644
--- a/db.c
+++ b/db.c
@@ -244,6 +244,41 @@ void db_create_message(i64 roomid,i64 userid,i64 timestamp,const char *message){
SQLITE(finalize,stmt);
}
+struct db_message_list db_get_messages(i64 roomid,i64 count){
+ sqlite3_stmt *stmt;
+ SQLITE(prepare_v2,database,
+ "select user, time, message "
+ "from Messages "
+ "where room = ? "
+ "order by time desc "
+ "limit ?"
+ ,-1,&stmt,NULL);
+ SQLITE(bind_int64,stmt,1,roomid);
+ SQLITE(bind_int64,stmt,2,count);
+
+ struct db_message_list ml;
+ i64 cap=count;
+ ml.count=0;
+ ml.list=malloc(cap,struct db_message);
+
+ int ret;
+ while((ret=sqlite3_step(stmt))==SQLITE_ROW){
+ if(ml.count==cap){
+ die("sqlite gave too many rows while 'limit %" PRIi64 "' was present",count);
+ }
+ ml.list[ml.count].roomid=roomid;
+ ml.list[ml.count].userid=sqlite3_column_int64(stmt,0);
+ ml.list[ml.count].timestamp=sqlite3_column_int64(stmt,1);
+ ml.list[ml.count].message=strdup((const char*)sqlite3_column_text(stmt,2));
+ ml.count++;
+ }
+
+ if(ret!=SQLITE_DONE)die_sqlite("sqlite3_step");
+ SQLITE(finalize,stmt);
+
+ return ml;
+}
+
void db_nullify_name_id(struct db_name_id ni){
if(ni.name)free(ni.name);
@@ -264,3 +299,11 @@ void db_nullify_user_list(struct db_user_list ul){
if(ul.list)free(ul.list);
ul.list=NULL;
}
+
+void db_nullify_message_list(struct db_message_list ml){
+ for(i64 i=0;i<ml.count;i++){
+ free(ml.list[i].message);
+ }
+ if(ml.list)free(ml.list);
+ ml.list=NULL;
+}