int se_document_create(sedocument *o, uint8_t flags) { sedb *db = (sedb*)o->o.parent; se *e = se_of(&db->o); assert(o->created == 0); assert(o->v == NULL); /* create document from raw data */ if (o->raw) { o->v = sv_vbuildraw(db->r, o->raw); if (ssunlikely(o->v == NULL)) return sr_oom(&e->error); o->created = 1; return 0; } /* ensure all keys are set */ if (ssunlikely(o->fields_count_keys != db->scheme->scheme.keys_count)) return sr_error(&e->error, "%s", "incomplete key"); /* set auto fields */ uint32_t timestamp = UINT32_MAX; if (db->scheme->scheme.has_timestamp) { timestamp = ss_timestamp(); sf_autoset(&db->scheme->scheme, o->fields, ×tamp); } o->v = sv_vbuild(db->r, o->fields); if (ssunlikely(o->v == NULL)) return sr_oom(&e->error); sf_flagsset(db->r->scheme, sv_vpointer(o->v), flags); o->created = 1; return 0; }
static svv* allocv(sr *r, uint64_t lsn, uint8_t flags, uint32_t key) { sfv pv; pv.key = (char*)&key; pv.r.size = sizeof(uint32_t); pv.r.offset = 0; svv *v = sv_vbuild(r, &pv, 1, NULL, 0); v->lsn = lsn; v->flags = flags; return v; }
static void addv(sdbuild *b, sr *r, uint64_t lsn, uint8_t flags, int *key) { sfv pv; pv.key = (char*)key; pv.r.size = sizeof(uint32_t); pv.r.offset = 0; svv *v = sv_vbuild(r, &pv, 1, (char*)key, sizeof(uint32_t)); v->lsn = lsn; v->flags = flags; sv vv; sv_init(&vv, &sv_vif, v, NULL); sd_buildadd(b, r, &vv, flags & SVDUP); sv_vfree(r->a, v); }
static void alloclogv(svlog *log, sr *r, uint64_t lsn, uint8_t flags, int key) { sfv pv; pv.key = (char*)&key; pv.r.size = sizeof(uint32_t); pv.r.offset = 0; svv *v = sv_vbuild(r, &pv, 1, NULL, 0); v->lsn = lsn; v->flags = flags; svlogv logv; logv.id = 0; logv.next = 0; sv_init(&logv.v, &sv_vif, v, NULL); sv_logadd(log, r->a, &logv, NULL); }
static void addv(sdbuild *b, sr *r, uint64_t lsn, uint8_t flags, int *key) { sfv pv[2]; pv[0].pointer = (char*)key; pv[0].size = sizeof(uint32_t); pv[1].pointer = NULL; pv[1].size = 0; svv *v = sv_vbuild(r, pv, 0); v->lsn = lsn; v->flags = flags; sv vv; sv_init(&vv, &sv_vif, v, NULL); sd_buildadd(b, r, &vv, flags & SVDUP); sv_vunref(r, v); }
static void alloclogv(svlog *log, sr *r, uint8_t flags, int key) { sfv pv[2]; pv[0].pointer = (char*)&key; pv[0].size = sizeof(uint32_t); pv[1].pointer = NULL; pv[1].size = 0; svv *v = sv_vbuild(r, pv); v->flags = flags; svlogv logv; logv.id = 0; logv.next = 0; sv_init(&logv.v, &sv_vif, v, NULL); sv_logadd(log, r->a, &logv, NULL); }
int se_document_createkey(sedocument *o) { sedb *db = (sedb*)o->o.parent; se *e = se_of(&db->o); if (o->created) return 0; assert(o->v == NULL); /* set prefix */ if (o->prefix) { if (db->scheme->scheme.keys[0]->type != SS_STRING) return sr_error(&e->error, "%s", "prefix search is only " "supported for a string key"); void *copy = ss_malloc(&e->a, o->prefix_size); if (ssunlikely(copy == NULL)) return sr_oom(&e->error); memcpy(copy, o->prefix, o->prefix_size); o->prefix_copy = copy; } /* set unspecified min/max keys, depending on * iteration order */ if (ssunlikely(o->fields_count_keys != db->scheme->scheme.keys_count)) { if (o->prefix && o->fields_count_keys == 0) { memset(o->fields, 0, sizeof(o->fields)); o->fields[0].pointer = o->prefix; o->fields[0].size = o->prefix_size; } sf_limitapply(&db->limit, &db->scheme->scheme, o->fields, o->order); o->fields_count = db->scheme->scheme.fields_count; o->fields_count_keys = db->scheme->scheme.keys_count; } o->v = sv_vbuild(db->r, o->fields); if (ssunlikely(o->v == NULL)) return sr_oom(&e->error); sf_flagsset(db->r->scheme, sv_vpointer(o->v), SVGET); o->created = 1; return 0; }
static void svv_kv(stc *cx) { sra a; sr_aopen(&a, &sr_stda); srkey cmp; sr_keyinit(&cmp); srkeypart *part = sr_keyadd(&cmp, &a); t( sr_keypart_setname(part, &a, "key") == 0 ); t( sr_keypart_set(part, &a, "u32") == 0 ); sr r; sr_init(&r, NULL, &a, NULL, SR_FKV, &cmp, NULL, NULL, NULL); uint32_t key = 123; uint32_t value = 321; srformatv pv; pv.key = (char*)&key; pv.r.size = sizeof(key); pv.r.offset = 0; svv *vv = sv_vbuild(&r, &pv, 1, (char*)&value, sizeof(value)); t( vv != NULL ); vv->flags = SVSET; vv->lsn = 10; sv v; sv_init(&v, &sv_vif, vv, NULL); t( sv_flags(&v) == SVSET ); t( sv_lsn(&v) == 10 ); sv_lsnset(&v, 8); t( sv_lsn(&v) == 8 ); t( *(uint32_t*)sr_formatkey(sv_pointer(&v), 0) == key ); t( sr_formatkey_size(sv_pointer(&v), 0) == sizeof(key) ); t( *(uint32_t*)sr_formatvalue(SR_FKV, &cmp, sv_pointer(&v)) == value ); t( sr_formatvalue_size(SR_FKV, &cmp, sv_pointer(&v), sv_size(&v) ) == sizeof(value) ); sv_vfree(&a, vv); sr_keyfree(&cmp, &a); }