MCDB_File
view release on metacpan or search on metacpan
MCDB_File.xs view on Meta::CPAN
SV * k;
INIT:
if (!SvOK(k)) XSRETURN_UNDEF;
CODE:
RETVAL = mcdbxs_nextkey(this);
if (!RETVAL) XSRETURN_UNDEF;
OUTPUT:
RETVAL
void
mcdbxs_DESTROY(sv)
SV * sv;
PREINIT:
struct mcdbxs_read *this;
CODE:
if (sv_isobject(sv) && SvTYPE(SvRV(sv)) == SVt_PVMG) {
this = INT2PTR(struct mcdbxs_read *, SvIV((SV *)SvRV(sv)));
mcdb_mmap_destroy(this->m.map);
Safefree(this);
}
AV *
mcdbxs_multi_get(this, k)
struct mcdbxs_read * this;
SV * k;
PREINIT:
STRLEN klen;
char *kp;
INIT:
if (!SvOK(k)) XSRETURN_UNDEF;
CODE:
kp = SvPV(k, klen);
RETVAL = newAV(); /* might be redundant (see .c generated from .xs) */
sv_2mortal((SV *)RETVAL);
if (mcdb_findstart(&this->m, kp, klen))
while (mcdb_findnext(&this->m, kp, klen))
av_push(RETVAL,
mcdbxs_svcp(mcdb_dataptr(&this->m),mcdb_datalen(&this->m)));
OUTPUT:
RETVAL
void
mcdbxs_madvise(this, advice)
struct mcdbxs_read * this;
int advice;
MODULE = MCDB_File PACKAGE = MCDB_File::Make PREFIX = mcdbxs_make_
# /*(MCDB_FILE::Make::insert instead of STORE to support multi-insert)*/
# /*(mcdb supports multiple records with same key, so a STORE method might be
# * misleading if caller incorrectly assumes value replaced for repeated key)*/
void
mcdbxs_make_insert(mk, ...)
struct mcdb_make * mk;
PREINIT:
SV *k, *v;
char *kp, *vp;
STRLEN klen, vlen;
int x;
PPCODE:
for (x = 1; x+1 < items; x += 2) {
k = ST(x); v = ST(x+1);
if (SvOK(k) && SvOK(v)) {
kp = SvPV(k, klen); vp = SvPV(v, vlen);
if (mcdb_make_add(mk, kp, klen, vp, vlen) != 0)
croak("MCDB_File::Make::insert: %s", Strerror(errno));
}
else
croak("MCDB_File::Make::insert: invalid argument");
}
struct mcdb_make *
mcdbxs_make_new(CLASS, fname, ...)
char * CLASS;
char * fname;
PREINIT:
struct mcdb_make *mk;
CODE:
RETVAL = Newx(mk, 1, struct mcdb_make);
if (mcdb_makefn_start(mk, fname, mcdbxs_malloc, mcdbxs_free) == 0
&& mcdb_make_start(mk, mk->fd, mcdbxs_malloc, mcdbxs_free) == 0) {
if (items >= 3)
mk->st_mode = SvIV(ST(2)); /* optional mcdb perm mode */
}
else {
mcdbxs_make_destroy(mk);
XSRETURN_UNDEF;
}
OUTPUT:
RETVAL
void
mcdbxs_make_DESTROY(sv)
SV * sv;
CODE:
if (sv_isobject(sv) && SvTYPE(SvRV(sv)) == SVt_PVMG)
mcdbxs_make_destroy(INT2PTR(struct mcdb_make *,SvIV((SV *)SvRV(sv))));
void
mcdbxs_make_finish(mk, ...)
struct mcdb_make * mk;
PREINIT:
bool do_fsync = true;
CODE:
if (items >= 2)
do_fsync = SvIV(ST(1)) != 0; /* optional control fsync */
if (mcdb_make_finish(mk) != 0 || mcdb_makefn_finish(mk, do_fsync) != 0) {
/*mcdb_make_destroy(mk);*//* already called in mcdb_make_finish() */
mcdb_makefn_cleanup(mk);
croak("MCDB_File::Make::finish: %s", Strerror(errno));
}
( run in 1.815 second using v1.01-cache-2.11-cpan-5511b514fd6 )