CDB_File

 view release on metacpan or  search on metacpan

CDB_File.xs  view on Meta::CPAN

    CODE:
        if(strlen(option_key) == 4 && strnEQ("utf8", option_key, 4) && is_utf8 )
#ifdef CDB_FILE_HAS_UTF8_HASH_MACROS
        croak("utf8 CDB_Files are not supported below Perl 5.14");
#else
        utf8_chosen = TRUE;
#endif

        Newxz(cdbmake, 1, cdb_make);
        cdbmake->f = PerlIO_open(fntemp, "wb");
        cdbmake->is_utf8 = utf8_chosen;

        if (!cdbmake->f) XSRETURN_UNDEF;

        if (cdb_make_start(cdbmake) < 0) XSRETURN_UNDEF;

        /* Oh, for referential transparency. */
        New(0, cdbmake->fn, strlen(fn) + 1, char);
        New(0, cdbmake->fntemp, strlen(fntemp) + 1, char);
        strcpy(cdbmake->fn, fn);
        strcpy(cdbmake->fntemp, fntemp);

        CLASS = "CDB_File::Maker"; /* OK, so this is a hack */

        RETVAL = cdbmake;

    OUTPUT:
        RETVAL

MODULE = CDB_File    PACKAGE = CDB_File::Maker    PREFIX = cdbmaker_

void
cdbmaker_DESTROY(sv)
        SV *   sv

        PREINIT:
        cdb_make *  this;

        CODE:
            if (sv_isobject(sv) && (SvTYPE(SvRV(sv)) == SVt_PVMG) ) {
                this = (cdb_make*)SvIV(SvRV(sv));
                if(this->f) {
                    PerlIO_close(this->f);
                }
                Safefree(this);
            }

void
cdbmaker_insert(this, ...)
    cdb_make *        this

    PREINIT:
        char *kp, *vp, packbuf[8];
        int  x;
        bool is_utf8;
        STRLEN klen, vlen;
        U32 h;
        SV *k;
        SV *v;

    PPCODE:
        is_utf8 = this->is_utf8;

        for (x = 1; x < items; x += 2) {
            k = ST(x);
            v = ST(x+1);

            if(!SvOK(k)) {
                Perl_warn(aTHX_ "Use of uninitialized value in hash key");
                k = sv_2mortal(newSVpv("", 0));
            }

            if(!SvOK(v)) {
                Perl_warn(aTHX_ "undef values cannot be stored in CDB_File. Storing an empty string instead");
                v = sv_2mortal(newSVpv("", 0));
            }

            kp = is_utf8 ? SvPVutf8(k, klen) : SvPV(k, klen);
            vp = is_utf8 ? SvPVutf8(v, vlen) : SvPV(v, vlen);

            uint32_pack(packbuf, klen);
            uint32_pack(packbuf + 4, vlen);

            if (PerlIO_write(this->f, packbuf, 8) < 8)
                writeerror();

            h = cdb_hash(kp, klen);
            if (PerlIO_write(this->f, kp, klen) < klen)
                writeerror();
            if (PerlIO_write(this->f, vp, vlen) < vlen)
                writeerror();

            if (cdb_make_addend(this, klen, vlen, h) == -1)
                nomem();
        }

int
cdbmaker_finish(this)
    cdb_make *this

    PREINIT:
        char buf[8];
        int i;
        U32 len, u;
        U32 count, memsize, where;
        struct cdb_hplist *x, *prev;
        struct cdb_hp *hp;

    CODE:
        for (i = 0; i < 256; ++i)
            this->count[i] = 0;

        for (x = this->head; x; x = x->next) {
            i = x->num;
            while (i--) {
                ++this->count[255 & x->hp[i].h];
            }
        }

        memsize = 1;
        for (i = 0; i < 256; ++i) {



( run in 1.494 second using v1.01-cache-2.11-cpan-71847e10f99 )