Files
xahaud/db/util.c
Vinnie Falco c58450a44b Squashed 'src/sophia/' content from commit 9d29b94
git-subtree-dir: src/sophia
git-subtree-split: 9d29b94cd66d3bd67082642b9a1f6dea470f0730
2013-09-17 10:09:27 -07:00

106 lines
2.1 KiB
C

/*
* sophia database
* sphia.org
*
* Copyright (c) Dmitry Simonenko
* BSD License
*/
#include <sp.h>
char *sp_memdup(sp *s, void *src, size_t size)
{
char *v = sp_malloc(&s->a, size);
if (spunlikely(v == NULL))
return NULL;
memcpy(v, src, size);
return v;
}
sppage *sp_pagenew(sp *s, spepoch *e) {
sppage *page = sp_malloc(&s->a, sizeof(sppage));
if (spunlikely(page == NULL))
return NULL;
memset(page, 0, sizeof(sppage));
page->epoch = e;
sp_listinit(&page->link);
return page;
}
void sp_pageattach(sppage *p) {
assert(p->epoch != NULL);
sp_listappend(&((spepoch*)p->epoch)->pages, &p->link);
}
void sp_pagedetach(sppage *p) {
assert(p->epoch != NULL);
sp_listunlink(&p->link);
}
void sp_pagefree(sp *s, sppage *p) {
sp_listunlink(&p->link);
sp_free(&s->a, p->min);
sp_free(&s->a, p->max);
sp_free(&s->a, p);
}
static inline spv*
sp_vnewof(sp *s, void *k, uint16_t size, int reserve) {
spv *v = sp_malloc(&s->a, sizeof(spv) + size + reserve);
if (spunlikely(v == NULL))
return NULL;
v->epoch = 0;
v->size = size;
v->flags = 0;
memcpy(v->key, k, size);
return v;
}
spv *sp_vnew(sp *s, void *k, uint16_t size) {
return sp_vnewof(s, k, size, 0);
}
spv *sp_vnewv(sp *s, void *k, uint16_t size, void *v, uint32_t vsize)
{
spv *vn = sp_vnewof(s, k, size, sizeof(uint32_t) + vsize);
if (spunlikely(vn == NULL))
return NULL;
memcpy(vn->key + vn->size, &vsize, sizeof(uint32_t));
memcpy(vn->key + vn->size + sizeof(uint32_t), v, vsize);
return vn;
}
spv *sp_vnewh(sp *s, spvh *v) {
spv *vn = sp_vnewof(s, v->key, v->size, 0);
if (spunlikely(vn == NULL))
return NULL;
vn->flags = v->flags;
return vn;
}
spv *sp_vdup(sp *s, spv *v)
{
spv *vn = sp_malloc(&s->a, sizeof(spv) + v->size);
if (spunlikely(vn == NULL))
return NULL;
memcpy(vn, v, sizeof(spv) + v->size);
return vn;
}
spv *sp_vdupref(sp *s, spref *r, uint32_t epoch)
{
spv *vn = NULL;
switch (r->type) {
case SPREFM: vn = sp_vdup(s, r->v.v);
break;
case SPREFD: vn = sp_vnewh(s, r->v.vh);
break;
}
if (spunlikely(vn == NULL))
return NULL;
vn->epoch = epoch;
vn->flags = 0;
return vn;
}