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 )