int rl_list_serialize(rlite *UNUSED(db), void *obj, unsigned char *data) { rl_list *list = obj; put_4bytes(data, list->left); put_4bytes(&data[4], list->right); put_4bytes(&data[8], list->max_node_size); put_4bytes(&data[12], list->size); return RL_OK; }
int rl_list_node_serialize_long(rlite *UNUSED(db), void *obj, unsigned char *data) { rl_list_node *node = obj; put_4bytes(data, node->size); put_4bytes(&data[4], node->left); put_4bytes(&data[8], node->right); long i, pos = 12; for (i = 0; i < node->size; i++) { put_4bytes(&data[pos], *(long *)(node->elements[i])); pos += 4; } return RL_OK; }
int rl_header_serialize(struct rlite *db, void *UNUSED(obj), unsigned char *data) { int identifier_len = strlen((char *)identifier); memcpy(data, identifier, identifier_len); put_4bytes(&data[identifier_len], db->page_size); put_4bytes(&data[identifier_len + 4], db->next_empty_page); put_4bytes(&data[identifier_len + 8], db->number_of_pages); put_4bytes(&data[identifier_len + 12], db->number_of_databases); long i, pos = identifier_len + 16; for (i = 0; i < db->number_of_databases + RLITE_INTERNAL_DB_COUNT; i++) { if (db->databases[i] != 0) { put_4bytes(&data[pos], db->databases[i]); } pos += 4; } return RL_OK; }
int rl_write_signal(const char *signal_name, const char *data, size_t datalen) { char header[FIFO_HEADER_SIZE]; put_4bytes((unsigned char *)header, datalen); uint64_t crc = rl_crc64(0, (unsigned char *)data, datalen); memrev64ifbe(&crc); memcpy(&header[4], &crc, 8); int fd = open(signal_name, O_WRONLY | O_NONBLOCK); if (fd == -1) { // fifo may not always exist on our code // it is a way to signal between processes, but it is show and forget return RL_OK; } write(fd, header, FIFO_HEADER_SIZE); write(fd, data, datalen); close(fd); return RL_OK; }