DB-SPEEDYB

 view release on metacpan or  search on metacpan

SPEEDYB.xs  view on Meta::CPAN

#ifdef __cpluscplus
extern "C" {
#endif

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#ifdef __cpluscplus
}
#endif

#include "c/speedyb.c"

// XXX - these do not work....
#ifdef NDEBUG
#define LOG(fmt,...) printf( "%s() - " ## fmt ## "\n", __func__, __VA_ARGS__ );
#define LOG0(fmt) printf( "%s()\n", __func__ );
#else
#define LOG(fmt,...) ;
#define LOG0(fmt) ;
#endif // NDEBUG

typedef struct
{
    speedyb_reader_t  reader;
    bool              iter;
    bool              open;
} SPEEDYB;

MODULE = DB::SPEEDYB          PACKAGE = DB::SPEEDYB
## allows the INCLUDEs below to work

PROTOTYPES: DISABLE

SPEEDYB*
new( const char* CLASS )
CODE:
    LOG0(); // printf( "%s()\n", __func__ );
    RETVAL = calloc( 1, sizeof( SPEEDYB ));
    // XXX - eek.  no error-check on the calloc
    RETVAL->iter = FALSE;
    RETVAL->open = FALSE;
    // printf( "%s() - RETVAL => [%p]\n", __func__, RETVAL );
    LOG( "RETVAL => [%p]", RETVAL );
OUTPUT:
    RETVAL

void
DESTROY( SPEEDYB* THIS )
PPCODE:
    // printf( "%s() - THIS => [%p]\n", __func__, THIS );
    LOG( "THIS => [%p]", THIS );
    if (items != 1)
       croak("THIS");
    // XXX - eek.  no error-check on THIS (nullptr?)
    free( THIS );
    XSRETURN_UNDEF;

bool
open( SPEEDYB* THIS, char* db_filename )
PREINIT:
    speedyb_rc_t rv;
CODE:
    if ( items != 2 )
       croak("THIS, db_filename");
    if ( THIS->open )
        XSRETURN_UNDEF;
    // printf( "%s() - THIS => [%p]; db_filename => [%s]\n", __func__, THIS, db_filename );
    LOG( "THIS => [%p]; db_filename => [%s]", THIS, db_filename );
    rv = speedyb_open( &(THIS->reader), db_filename );
    THIS->open = (SPEEDYB_OK == rv) ? TRUE : FALSE;
    RETVAL = (SPEEDYB_OK == rv) ? 1 : 0;
OUTPUT:
    RETVAL

bool
close( SPEEDYB* THIS )
PREINIT:
    speedyb_rc_t rv;
CODE:
    if ( items != 1 )
       croak("THIS" );
    // printf( "%s() - THIS => [%p]; db_filename => [%s]\n", __func__, THIS, db_filename );
    LOG( "THIS => [%p]", THIS );
    rv = speedyb_close( &(THIS->reader));
    if (SPEEDYB_OK == rv)
        THIS->open = FALSE;
    RETVAL = (SPEEDYB_OK == rv) ? 1 : 0;
OUTPUT:
    RETVAL

void
get( SPEEDYB* THIS, char* key )
PREINIT:
    speedyb_rc_t rv;
    char* val;
    uint len;
PPCODE:
    // printf( "%s() - THIS => [%p]; key => [%s]\n", __func__, THIS, key );
    LOG( "THIS => [%p]; key => [%s]", THIS, key );
    if ( ! THIS->open )
       croak("DB::SPEEDYB::get() - not open; aborting" );
    rv = speedyb_get( &(THIS->reader), key, strlen(key), &val, &len );
    if ( SPEEDYB_OK != rv )
        XSRETURN_UNDEF;
    // printf( "%s() - THIS => [%p]; val => [%d] [%s]\n", __func__, THIS, len, val );
    LOG( "THIS => [%p]; val => [%d] [%s]", THIS, len, val );
    ST(0) = sv_newmortal();
    sv_setpvn( ST(0), val, len );
    XSRETURN(1);
 
void
each( SPEEDYB* THIS )
PREINIT:
    speedyb_rc_t rv;
    char* key;
    uint klen;
    char* val;
    uint vlen;
PPCODE:
    //  printf( "%s() - THIS => [%p]\n", __func__, THIS );
    LOG( "THIS => [%p]", THIS );
    if ( ! THIS->open )
       croak("DB::SPEEDYB::each() - not open; aborting" );
    if ( ! THIS->iter )
    {
        rv = speedyb_iterate_init( &(THIS->reader));
	if ( SPEEDYB_OK != rv )
	{
	    THIS->iter = FALSE;
	    XSRETURN_UNDEF;
        }
	else
            THIS->iter = TRUE;
    }
    rv = speedyb_iterate_next( &(THIS->reader), &key, &klen, &val, &vlen );
    // XXX - when do we reset the iterator state?
    //        THIS->iter = false;
    //  fprintf( stderr, "%s() - rv => [%d]\n", __func__, rv );
    LOG( "rv => [%d]; key => [%d] [%s]; val => [%d] [%s]", rv, klen, key, vlen, val );
    if ( SPEEDYB_OK != rv )
    {
        THIS->iter = FALSE;
        XSRETURN_EMPTY;
    }
    //  else if ( 0 == klen )
    //  {
    //      THIS->iter = FALSE;
    //      XSRETURN_EMPTY;
    //  }
    else
    {
        //  fprintf( stderr, "%s() - rv => [%d]; key => [%d] [%s]; val => [%d] [%s]\n", __func__, rv, klen, key, vlen, val );
	XPUSHs( sv_2mortal( newSVpv( key, klen )));
	XPUSHs( sv_2mortal( newSVpv( val, vlen )));
	XSRETURN(2);
    }
    XSRETURN_YES;
 
void
count( SPEEDYB* THIS )
PREINIT:
    speedyb_rc_t rv;
    uint nkeys;
PPCODE:
    // printf( "%s() - THIS => [%p]\n", __func__, THIS );
    LOG( "THIS => [%p]\n", THIS );
    if ( ! THIS->open )
       croak("DB::SPEEDYB::count() - not open; aborting" );
    rv = speedyb_get_num_keys( &(THIS->reader), &nkeys );
    if ( SPEEDYB_OK != rv )
        XSRETURN_UNDEF;
    ST(0) = sv_newmortal();
    sv_setiv( ST(0), nkeys );
    XSRETURN(1);

##	speedyb_rc_t
##	RC_OK()
##	CODE:
##	    RETVAL = SPEEDYB_OK;
##	OUTPUT:
##	    RETVAL
##	
##	speedyb_rc_t
##	RC_DONE()
##	CODE:
##	    RETVAL = SPEEDYB_DONE;
##	OUTPUT:
##	    RETVAL
##	
##	speedyb_rc_t
##	RC_EOPEN()
##	CODE:
##	    RETVAL = SPEEDYB_EOPEN;
##	OUTPUT:
##	    RETVAL
##	
##	speedyb_rc_t
##	RC_EIO()
##	CODE:
##	    RETVAL = SPEEDYB_EIO;
##	OUTPUT:
##	    RETVAL
##	
##	speedyb_rc_t
##	RC_EMAGIC()
##	CODE:
##	    RETVAL = SPEEDYB_EMAGIC;
##	OUTPUT:
##	    RETVAL
##	
##	speedyb_rc_t
##	RC_EVER()
##	CODE:
##	    RETVAL = SPEEDYB_EVER;
##	OUTPUT:
##	    RETVAL
##	
##	speedyb_rc_t
##	RC_ENXKEY()
##	CODE:
##	    RETVAL = SPEEDYB_ENXKEY;
##	OUTPUT:
##	    RETVAL



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