Refactor MeshMS ply-reading functions

Rename functions to use _prev instead of _next to mean reading
"backwards" ie, from newest to oldest, aka, from higher offsets
to lower offsets
This commit is contained in:
Andrew Bettison 2014-01-28 16:58:44 +10:30
parent 7b5752a111
commit b1992b3905
3 changed files with 18 additions and 17 deletions

View File

@ -242,7 +242,7 @@ static void ply_read_close(struct meshms_ply_read *ply)
// read the next record from the ply (backwards)
// returns 1 on EOF, -1 on failure
static int ply_read_next(struct meshms_ply_read *ply)
static int ply_read_prev(struct meshms_ply_read *ply)
{
ply->record_end_offset = ply->read.offset;
unsigned char footer[2];
@ -295,9 +295,9 @@ static int ply_read_next(struct meshms_ply_read *ply)
}
// keep reading past messages until you find this type.
static int ply_find_next(struct meshms_ply_read *ply, char type){
static int ply_find_prev(struct meshms_ply_read *ply, char type){
while(1){
int ret = ply_read_next(ply);
int ret = ply_read_prev(ply);
if (ret || ply->type==type)
return ret;
}
@ -387,8 +387,7 @@ static int update_conversation(const sid_t *my_sid, struct meshms_conversations
if (ply_read_open(&ply, &conv->their_ply.bundle_id, m_theirs))
goto end;
ret = ply_find_next(&ply, MESHMS_BLOCK_TYPE_MESSAGE);
ret = ply_find_prev(&ply, MESHMS_BLOCK_TYPE_MESSAGE);
if (ret!=0){
// no messages indicates that we didn't do anthing
if (ret>0)
@ -419,8 +418,7 @@ static int update_conversation(const sid_t *my_sid, struct meshms_conversations
goto end;
if (ply_read_open(&ply, &conv->my_ply.bundle_id, m_ours))
goto end;
ret = ply_find_next(&ply, MESHMS_BLOCK_TYPE_ACK);
ret = ply_find_prev(&ply, MESHMS_BLOCK_TYPE_ACK);
if (ret == -1)
goto end;
@ -737,13 +735,14 @@ int meshms_message_iterator_open(struct meshms_message_iterator *iter, const sid
goto fail;
if (ply_read_open(&iter->_read_sender, &iter->_conv->my_ply.bundle_id, iter->_manifest_sender))
goto fail;
// Seek to end of my ply.
if (iter->_conv->found_their_ply) {
if ((iter->_manifest_recipient = rhizome_new_manifest()) == NULL)
goto fail;
if (ply_read_open(&iter->_read_recipient, &iter->_conv->their_ply.bundle_id, iter->_manifest_recipient))
goto fail;
// Find the recipient's ACK so we know which messages have been delivered.
int r = ply_find_next(&iter->_read_recipient, MESHMS_BLOCK_TYPE_ACK);
// Find the recipient's latest ACK so we know which messages have been delivered.
int r = ply_find_prev(&iter->_read_recipient, MESHMS_BLOCK_TYPE_ACK);
if (r == 0) {
if (unpack_uint(iter->_read_recipient.buffer, iter->_read_recipient.record_length, &iter->sent_ack_offset) == -1)
iter->sent_ack_offset = 0;
@ -752,6 +751,8 @@ int meshms_message_iterator_open(struct meshms_message_iterator *iter, const sid
if (config.debug.meshms)
DEBUGF("Found recipient last ack @%"PRId64, iter->sent_ack_offset);
}
// Re-seek to end of their ply.
iter->_read_recipient.read.offset = iter->_read_recipient.read.length;
}
} else {
if (config.debug.meshms)
@ -779,7 +780,7 @@ void meshms_message_iterator_close(struct meshms_message_iterator *iter)
meshms_free_conversations(iter->_conv);
}
int meshms_message_iterator_next(struct meshms_message_iterator *iter)
int meshms_message_iterator_prev(struct meshms_message_iterator *iter)
{
assert(iter->_conv != NULL);
if (iter->_conv->found_my_ply) {
@ -792,7 +793,7 @@ int meshms_message_iterator_next(struct meshms_message_iterator *iter)
if (iter->_in_ack) {
if (config.debug.meshms)
DEBUGF("Reading other log from %"PRId64", to %"PRId64, iter->_read_recipient.read.offset, iter->_end_range);
ret = ply_find_next(&iter->_read_recipient, MESHMS_BLOCK_TYPE_MESSAGE);
ret = ply_find_prev(&iter->_read_recipient, MESHMS_BLOCK_TYPE_MESSAGE);
if (ret == 0 && iter->_read_recipient.read.offset >= iter->_end_range) {
iter->offset = iter->_read_recipient.record_end_offset;
iter->text = (const char *)iter->_read_recipient.buffer;
@ -802,7 +803,7 @@ int meshms_message_iterator_next(struct meshms_message_iterator *iter)
}
iter->_in_ack = 0;
}
if ((ret = ply_read_next(&iter->_read_sender)) == 0) {
if ((ret = ply_read_prev(&iter->_read_sender)) == 0) {
if (config.debug.meshms)
DEBUGF("Offset %"PRId64", type %d, received_read_offset %"PRId64, iter->_read_sender.read.offset, iter->_read_sender.type, iter->received_read_offset);
switch (iter->_read_sender.type) {
@ -971,7 +972,7 @@ int app_meshms_list_messages(const struct cli_parsed *parsed, struct cli_context
bool_t marked_read = 0;
int id = 0;
int ret;
while ((ret = meshms_message_iterator_next(&iter)) == 0) {
while ((ret = meshms_message_iterator_prev(&iter)) == 0) {
switch (iter.direction) {
case SENT:
if (iter.delivered && !marked_delivered){

View File

@ -100,7 +100,7 @@ void meshms_conversation_iterator_advance(struct meshms_conversation_iterator *)
* if (meshms_message_iterator_open(&it, &sender_sid, &recip_sid) == -1)
* return -1;
* int ret;
* while ((ret = meshms_message_iterator_next(&it)) == 0) {
* while ((ret = meshms_message_iterator_prev(&it)) == 0) {
* ...
* }
* meshms_message_iterator_close(&it);
@ -132,6 +132,6 @@ struct meshms_message_iterator {
};
int meshms_message_iterator_open(struct meshms_message_iterator *, const sid_t *sender, const sid_t *recipient);
void meshms_message_iterator_close(struct meshms_message_iterator *);
int meshms_message_iterator_next(struct meshms_message_iterator *);
int meshms_message_iterator_prev(struct meshms_message_iterator *);
#endif // __SERVAL_DNA__MESHMS_H

View File

@ -1201,7 +1201,7 @@ static int restful_meshms_messagelist_json(rhizome_http_request *r, const char *
r->finalise_union = finalise_union_meshms_messagelist;
r->u.msglist.rowcount = 0;
meshms_message_iterator_open(&r->u.msglist.iter, &r->sid1, &r->sid2);
if ((r->u.msglist.finished = meshms_message_iterator_next(&r->u.msglist.iter)) == -1)
if ((r->u.msglist.finished = meshms_message_iterator_prev(&r->u.msglist.iter)) == -1)
return -1;
r->u.msglist.phase = LIST_HEADER;
http_request_response_generated(&r->http, 200, "application/json", restful_meshms_messagelist_json_content);
@ -1271,7 +1271,7 @@ static int restful_meshms_messagelist_json_content_chunk(struct http_request *hr
strbuf_puts(b, "]");
if (!strbuf_overrun(b)) {
++r->u.msglist.rowcount;
if ((r->u.msglist.finished = meshms_message_iterator_next(&r->u.msglist.iter)) == -1)
if ((r->u.msglist.finished = meshms_message_iterator_prev(&r->u.msglist.iter)) == -1)
return -1;
}
return 1;