implemented server database and api for client database
This commit is contained in:
@@ -1,54 +1,45 @@
|
||||
#include "db_internal.h"
|
||||
#include "server_db_internal.h"
|
||||
|
||||
Result(bool) Channel_exists(CommonQueries* q, i64 id){
|
||||
Result(bool) Channel_exists(ServerQueries* q, i64 id){
|
||||
Deferral(1);
|
||||
|
||||
tsqlite_statement* st = q->channels.exists;
|
||||
try_void(tsqlite_statement_reset(st));
|
||||
try_void(tsqlite_statement_bind_i64(st, "id", id));
|
||||
Defer(tsqlite_statement_reset(st));
|
||||
try_void(tsqlite_statement_bind_i64(st, "$id", id));
|
||||
|
||||
try(bool has_result, i, tsqlite_statement_step(st));
|
||||
|
||||
Return RESULT_VALUE(i, has_result);
|
||||
}
|
||||
|
||||
Result(void) Channel_createOrUpdate(CommonQueries* q,
|
||||
Result(void) Channel_createOrUpdate(ServerQueries* q,
|
||||
i64 id, str name, str description)
|
||||
{
|
||||
Deferral(4);
|
||||
try_assert(id > 0);
|
||||
try_assert(name.len >= CHANNEL_NAME_SIZE_MIN && name.len <= CHANNEL_NAME_SIZE_MAX);
|
||||
try_assert(description.len <= CHANNEL_DESC_SIZE_MAX);
|
||||
|
||||
// create channels table
|
||||
try_void(tsqlite_statement_reset(q->channels.create_table));
|
||||
try_void(tsqlite_statement_bind_i64(q->channels.create_table, "name_max", CHANNEL_NAME_SIZE_MAX));
|
||||
try_void(tsqlite_statement_bind_i64(q->channels.create_table, "desc_max", CHANNEL_DESC_SIZE_MAX));
|
||||
try_void(tsqlite_statement_step(q->channels.create_table));
|
||||
|
||||
// create messages table
|
||||
try_void(tsqlite_statement_reset(q->messages.create_table));
|
||||
try_void(tsqlite_statement_step(q->messages.create_table));
|
||||
|
||||
tsqlite_statement* st = NULL;
|
||||
Defer(tsqlite_statement_reset(st));
|
||||
try(bool channel_exists, i, Channel_exists(q, id));
|
||||
if(channel_exists){
|
||||
// update existing channel
|
||||
try_void(tsqlite_statement_reset(q->channels.update));
|
||||
try_void(tsqlite_statement_bind_i64(q->channels.update, "id", id));
|
||||
try_void(tsqlite_statement_bind_str(q->channels.update, "name", str_copy(name), free));
|
||||
try_void(tsqlite_statement_bind_str(q->channels.update, "description", str_copy(description), free));
|
||||
try_void(tsqlite_statement_step(q->channels.update));
|
||||
st = q->channels.update;
|
||||
}
|
||||
else {
|
||||
// insert new channel
|
||||
try_void(tsqlite_statement_reset(q->channels.insert));
|
||||
try_void(tsqlite_statement_bind_i64(q->channels.insert, "id", id));
|
||||
try_void(tsqlite_statement_bind_str(q->channels.insert, "name", str_copy(name), free));
|
||||
try_void(tsqlite_statement_bind_str(q->channels.insert, "description", str_copy(description), free));
|
||||
try_void(tsqlite_statement_step(q->channels.insert));
|
||||
st = q->channels.insert;
|
||||
}
|
||||
try_void(tsqlite_statement_bind_i64(st, "$id", id));
|
||||
try_void(tsqlite_statement_bind_str(st, "$name", name, NULL));
|
||||
try_void(tsqlite_statement_bind_str(st, "$description", description, NULL));
|
||||
try_void(tsqlite_statement_step(st));
|
||||
|
||||
Return RESULT_VOID;
|
||||
}
|
||||
|
||||
Result(void) Channel_saveMessage(CommonQueries* q,
|
||||
Result(void) Channel_saveMessage(ServerQueries* q,
|
||||
i64 channel_id, i64 sender_id, Array(u8) content,
|
||||
DateTime* out_timestamp)
|
||||
{
|
||||
@@ -56,10 +47,10 @@ Result(void) Channel_saveMessage(CommonQueries* q,
|
||||
try_assert(content.len >= MESSAGE_SIZE_MIN && content.len <= MESSAGE_SIZE_MAX);
|
||||
|
||||
tsqlite_statement* st = q->messages.insert;
|
||||
try_void(tsqlite_statement_reset(st));
|
||||
try_void(tsqlite_statement_bind_i64(st, "channel_id", channel_id));
|
||||
try_void(tsqlite_statement_bind_i64(st, "sender_id", sender_id));
|
||||
try_void(tsqlite_statement_bind_blob(st, "content", Array_u8_copy(content), free));
|
||||
Defer(tsqlite_statement_reset(st));
|
||||
try_void(tsqlite_statement_bind_i64(st, "$channel_id", channel_id));
|
||||
try_void(tsqlite_statement_bind_i64(st, "$sender_id", sender_id));
|
||||
try_void(tsqlite_statement_bind_blob(st, "$content", content, NULL));
|
||||
|
||||
try(bool has_result, i, tsqlite_statement_step(st));
|
||||
try_assert(has_result);
|
||||
@@ -72,7 +63,7 @@ Result(void) Channel_saveMessage(CommonQueries* q,
|
||||
Return RESULT_VALUE(i, message_id);
|
||||
}
|
||||
|
||||
Result(void) Channel_loadMessageBlock(CommonQueries* q,
|
||||
Result(void) Channel_loadMessageBlock(ServerQueries* q,
|
||||
i64 channel_id, i64 first_message_id, u32 count,
|
||||
MessageBlockMeta* block_meta, Array(u8) block_data)
|
||||
{
|
||||
@@ -84,10 +75,10 @@ Result(void) Channel_loadMessageBlock(CommonQueries* q,
|
||||
}
|
||||
|
||||
tsqlite_statement* st = q->messages.get_block;
|
||||
try_void(tsqlite_statement_reset(st));
|
||||
try_void(tsqlite_statement_bind_i64(st, "channel_id", channel_id));
|
||||
try_void(tsqlite_statement_bind_i64(st, "first_message_id", first_message_id));
|
||||
try_void(tsqlite_statement_bind_i64(st, "count", count));
|
||||
Defer(tsqlite_statement_reset(st));
|
||||
try_void(tsqlite_statement_bind_i64(st, "$channel_id", channel_id));
|
||||
try_void(tsqlite_statement_bind_i64(st, "$first_message_id", first_message_id));
|
||||
try_void(tsqlite_statement_bind_i64(st, "$count", count));
|
||||
|
||||
zeroStruct(block_meta);
|
||||
MessageMeta msg_meta = {0};
|
||||
|
||||
Reference in New Issue
Block a user