bail(&cq,r);
r = cq_super_load(&cq,COQUET_FILE_MAIN,&super,1);
bail(&cq,r);
- cq_super_save(&cq,COQUET_FILE_MAIN,&super,1);
+ cq_super_save(&cq,COQUET_FILE_MAIN,&super,1,1);
r = (cq.vfs_funcs.close)(cq.vfs_data,COQUET_FILE_MAIN);
bail(&cq,r);
r = coquet_finish(&cq);
test_bail(&cq,r);
cq_super_load(&cq,COQUET_FILE_MAIN,&super,1);
- cq_super_save(&cq,COQUET_FILE_MAIN,&super,1);
+ cq_super_save(&cq,COQUET_FILE_MAIN,&super,1,1);
r = coquet_write_start(&cq,COQUET_FILE_MAIN,1);
test_bail(&cq,r);
#include <stdint.h>
#include "coquet.h"
+/* Pages begin with flags discriminating page type, followed by a series of
+ * zero or more headers determined by type. There is then the data tail. Headers
+ * are sequenced in the order of the declarations below.
+ */
+
+/* A true root page, a pt_root header follows */
+#define COQUET_PT_ROOT 0x01
+
+struct pt_root {
+ /* TODO nursery id */
+ uint64_t book_length; /* Pages to next pt_root, (0 = this is first) */
+ uint8_t page_hash[32]; /* HMAC SHA512-256 using global_iv */
+ uint8_t section_hash[32]; /* HMAC SHA512-256 using global_iv */
+};
+
+struct cq_page {
+ uint8_t flags;
+ struct pt_root root;
+ uint64_t data;
+};
+
/* byte offset of given main page. Note pgids are 1-based */
off_t cq_offset_main_page(coquet_t *cq, int which_file, u_int64_t pgid);
return r;
}
-int cq_super_save(coquet_t *cq, int which_file, struct cq_super *super, bool wait) {
+int cq_super_save(coquet_t *cq, int which_file, struct cq_super *super, bool wait, bool sync) {
int r, ret;
struct cq_super old;
}
/* sync */
- ret = (cq->vfs_funcs.sync)(cq->vfs_data,COQUET_FILE_MAIN,1);
+ if(sync) {
+ ret = (cq->vfs_funcs.sync)(cq->vfs_data,COQUET_FILE_MAIN,1);
+ }
/* unlock */
r = lock_super(cq,which_file,COQUET_LMODE_UN,wait);
r = cq_super_load(&cq,COQUET_FILE_MAIN,&super,1);
test_bail(&cq,r);
- cq_super_save(&cq,COQUET_FILE_MAIN,&super,1);
+ cq_super_save(&cq,COQUET_FILE_MAIN,&super,1,1);
test_bail(&cq,r);
super.desired.nursery_size = 11; /* change something for B */
cq_super_set_desc(&super,"test file");
- cq_super_save(&cq,COQUET_FILE_MAIN,&super,1);
+ cq_super_save(&cq,COQUET_FILE_MAIN,&super,1,1);
test_bail(&cq,r);
test_close(&cq);
/* check updated in file successfully */
test_open(&cq);
- cq_super_save(&cq,COQUET_FILE_MAIN,&super,1);
+ cq_super_save(&cq,COQUET_FILE_MAIN,&super,1,1);
test_close(&cq);
test_open(&cq);
test_open(cq);
r = cq_super_load(cq,COQUET_FILE_MAIN,&super,1);
super.current.nursery_size = 12;
- cq_super_save(cq,COQUET_FILE_MAIN,&super,1);
+ cq_super_save(cq,COQUET_FILE_MAIN,&super,1,1);
if(also_b) {
super.current.nursery_size = 11;
- cq_super_save(cq,COQUET_FILE_MAIN,&super,1);
+ cq_super_save(cq,COQUET_FILE_MAIN,&super,1,1);
}
if(corrupt>-1) {
r = (cq->vfs_funcs.read)(cq->vfs_data,COQUET_FILE_MAIN,&d,corrupt,1);
#include "coquet.h"
-int cq_super_save(coquet_t *cq, int which_file, struct cq_super *super, bool wait);
+int cq_super_save(coquet_t *cq, int which_file, struct cq_super *super, bool wait, bool sync);
int cq_super_load(coquet_t *cq, int which_file, struct cq_super *super, bool create);
void cq_super_set_desc(struct cq_super *super, char *desc);
char * cq_super_get_desc(struct cq_super *super);