Db-GTM
view release on metacpan or search on metacpan
RETVAL
void
gvn2list(...)
ALIAS:
_str2list = 1
GTM::gvn2list = 2
GTM::_str2list = 3
GtmEnvPtr::gvn2list = 4
GtmEnvPtr::_str2list = 5
PPCODE:
{
cppack *start = NULL, *next; SV *ret; unsigned s , x; char *glvn;
s = (ix < 4) ? 0 : 1; if(items < s) XSRETURN_UNDEF;
start = unpackgvn( SvPV(ST(s),x) ); while(start) {
ret = sv_newmortal(); sv_setpv(ret, start->loc); XPUSHs(ret);
next = start->next; free(start); start = next;
}
}
void
list2gvn(...)
ALIAS:
_list2str = 1
GTM::list2gvn = 2
GTM::_list2str = 3
GtmEnvPtr::list2gvn = 4
GtmEnvPtr::_list2str = 5
GtmEnvPtr::node = 6
PPCODE:
{
strpack *args;
GtmEnv *pfx = (ix<4) ? NULL : (GtmEnv *)SvIV((SV*)SvRV(ST(0)));
unsigned i,s = (ix<4) ? 0 : 1, n; SV *ret;
gtm_string_t value, glvn;
EXTEND(SP,1); if(items>s) {
args = (strpack *)calloc(items-s,sizeof(strpack));
for(i=s;i<items;i++)
args[i-s].address = (char *)SvPV(ST(i),args[i-s].length);
n=packgvn(pfx,items-s,args,(ix<4)?NO_PREFIX:0,&glvn); free(args);
} else { n = packgvn(pfx,0,NULL,0,&glvn); }
if(glvn.address) {
ret = sv_newmortal(); sv_setpv(ret, glvn.address); PUSHs(ret);
if(n) free(glvn.address);
} else PUSHs(&PL_sv_undef);
}
void
END()
PPCODE:
{
if( _GTMinvoc ) {
gtm_exit();
#ifdef _GT_NEED_TERMFIX
tcsetattr(STDIN_FILENO,0,_GTMterm); free(_GTMterm);
#endif
_GTMinvoc = 0;
}
}
MODULE = Db::GTM PACKAGE = GtmEnvPtr
void
DESTROY(gt_env)
GtmEnv *gt_env
PPCODE:
{
gtenv_clear(gt_env);
}
void
get(gt_env,...)
GtmEnv *gt_env
ALIAS:
retrieve = 1
FETCH = 2
EXISTS = 3
exists = 4
PPCODE:
{
strpack *args; unsigned i;
unsigned long exst=0,n; gtm_string_t value,glvn;
SV *ret=sv_newmortal(); EXTEND(SP, 1);
if( GIMME_V==G_VOID ) XSRETURN_UNDEF; if(items>1) {
args = (strpack *)calloc(items-1,sizeof(strpack));
for(i=1;i<items;i++)
args[i-1].address = (char *)SvPV(ST(i),args[i-1].length);
n=packgvn(gt_env,items-1,args,(gt_env->flags & TIED),&glvn);
else { sv_setpvn(ret, value.address, value.length); PUSHs(ret); }
} else PUSHs(&PL_sv_undef); // Bad GVN name
}
void
set(gt_env,...)
GtmEnv *gt_env
ALIAS:
store = 1
STORE = 2
PPCODE:
{
strpack *args; unsigned i,n; gtm_string_t glvn;
if(items>2) {
args = (strpack *)calloc(items-2,sizeof(strpack));
for(i=1;i<(items-1);i++)
args[i-1].address = (char *)SvPV(ST(i),args[i-1].length);
n=packgvn(gt_env,items-2,args,(gt_env->flags & TIED),&glvn);
free(args);
} else { n=packgvn(gt_env,0,NULL,0,&glvn); }
GtmEnv *gt_env
ALIAS:
next = 1
NEXTKEY = 2
first = 3
FIRSTKEY = 4
haschildren = 5
last = 6
revorder = 7
prev = 8
PPCODE:
{
strpack *args,*x; unsigned i, aq=0,n; int dir=(ix>5)?-1:1; SV *ret;
char *addquot=""; gtm_string_t value, glvn;
if( GIMME_V==G_VOID ) XSRETURN_UNDEF;
if(items==1 || (ix>2 && ix<7) ) { items++; aq++; }
args = (strpack *)calloc(items-1,sizeof(strpack));
for(i=1;i<(items-aq);i++)
args[i-1].address = (char *)SvPV(ST(i),args[i-1].length);
if(aq) { args[items-2].address = addquot; args[items-2].length = 0; }
}
void
kill(gt_env,...)
GtmEnv *gt_env
ALIAS:
DELETE = 1
CLEAR = 2
ks = 3
kv = 4
PPCODE:
{
strpack *args; unsigned i,n; gtm_string_t glvn;
if(items>1) {
args = (strpack *)calloc(items-1,sizeof(strpack));
for(i=1;i<items;i++)
args[i-1].address = (char *)SvPV(ST(i),args[i-1].length);
n = packgvn(gt_env,items-1,args,(gt_env->flags & TIED),&glvn);
free(args);
} else { n = packgvn(gt_env,0,NULL,0,&glvn); }
}
if(n) free(glvn.address); if(gt_env->last_err) {
err_gtm(gt_env); PUSHs(newSViv(gt_env->last_err));
} else PUSHs(newSViv(0)); // Kill OK
} else PUSHs(newSViv(1)); // Bad GVN name
}
void
query(gt_env,...)
GtmEnv *gt_env
PPCODE:
{
SV *ret; char **brk;
strpack *args; cppack *start=NULL,*next; gtm_string_t value, glvn;
unsigned i,z,n;
if( GIMME_V==G_VOID ) XSRETURN_UNDEF; if(items>1) {
args = (strpack *)calloc(items-1,sizeof(strpack));
for(i=1;i<items;i++)
args[i-1].address = (char *)SvPV(ST(i),args[i-1].length);
n=packgvn(gt_env,items-1,args,0,&glvn); free(args);
ret = sv_newmortal(); sv_setpv(ret, start->loc); XPUSHs(ret);
next = start->next; free(start); start = next;
}
}
} else XPUSHs(&PL_sv_undef);
}
void
children(gt_env,...)
GtmEnv *gt_env
PPCODE:
{
char *end="\")\x00\x00",*loc; unsigned count=0,n,kids=0,base;
strpack *args; gtm_string_t value,glvn,buf;
if( GIMME_V==G_VOID ) XSRETURN_UNDEF;
buf.address = (char *)calloc(_GT_MAX_GVNLENGTH+5,sizeof(char));
if(items>1) {
unsigned i; items--;
args = (strpack *)calloc(items,sizeof(strpack));
for(i=0;i<items;i++)
GTMDB::copy = 8
merge = 1
GTM::merge = 5
GTMDB::merge = 9
clobber = 2
GTM::clobber = 6
GTMDB::clobber = 10
overwrite = 3
GTM::overwrite = 7
GTMDB::overwrite = 11
PPCODE:
{
strpack *args; unsigned i,mid=0,ov=(ix & 2)?1:0,ob=(ix<4)?1:0,s=1,d=1;
GtmEnv *gt_env = (ob) ? (GtmEnv *)SvIV((SV*)SvRV(ST(0))) : NULL;
gtm_string_t src, dst; unsigned fs, fd; strpack value; SV *ret;
EXTEND(SP,1); if(items == (ob+2)) {
// Two arguments passed in...
// They could either be GtmEnvPtrs (PERL GTMDB objects)
// or they could be global names like ^FOO("BAR"), or both
if(!sv_isa(ST(ob),"GtmEnvPtr")) {
if(fs && src.address) free(src.address);
if(fd && dst.address) free(dst.address);
}
void
txnstart(gt_env)
GtmEnv *gt_env
ALIAS:
txnabort = 1
txncommit = 2
PPCODE:
{
EXTEND(SP,1); switch(ix) {
case 0: gt_env->flags |= IN_TXN; break;
case 1: if(inTxn(gt_env)) {
gt_env->last_err = gtm_ci("tabort",gt_env->gtmEnvId);
gt_env->flags -= IN_TXN;
}
break;
case 2: if(inTxn(gt_env)) {
gt_env->last_err = gtm_ci("tcommit",gt_env->gtmEnvId);
break;
}
if(gt_env->last_err) {
err_gtm(gt_env); PUSHs(newSViv(gt_env->last_err)); // GTM error
} else PUSHs(newSViv(0)); // Txn command OK
}
void
lock(gt_env,...)
GtmEnv *gt_env
PPCODE:
{
strpack *args; unsigned i,n; gtm_string_t glvn;
gtm_long_t value, timeout = 0;
if(items>1) {
timeout = (gtm_long_t)SvIV(ST(items-1));
args = (strpack *)calloc(items-2,sizeof(strpack));
for(i=1;i<(items-1);i++)
args[i-1].address = (char *)SvPV(ST(i),args[i-1].length);
n=packgvn(gt_env,items-2,args,(gt_env->flags & TIED),&glvn);
sprintf(gt_env->errmsg,"ERROR: Lock not obtained.");
} else if(gt_env->last_err) {
err_gtm(gt_env); PUSHs(newSViv(gt_env->last_err)); // GTM error
} else PUSHs(newSViv(0)); // Lock OK
}
}
void
unlock(gt_env,...)
GtmEnv *gt_env
PPCODE:
{
strpack *args; unsigned i,n; gtm_string_t glvn;
if(items>1) {
args = (strpack *)calloc(items-1,sizeof(strpack));
for(i=1;i<items;i++)
args[i-1].address = (char *)SvPV(ST(i),args[i-1].length);
n=packgvn(gt_env,items-1,args,(gt_env->flags & TIED),&glvn);
free(args);
} else { n=packgvn(gt_env,0,NULL,0,&glvn); }
EXTEND(SP,1); gt_env->last_err=gtm_ci("unlock",&glvn);
if(n) free(glvn.address); if(gt_env->last_err) {
err_gtm(gt_env); PUSHs(newSViv(gt_env->last_err)); // GTM error
} else PUSHs(newSViv(0)); // Unlock OK
}
}
void
getid(gt_env)
GtmEnv *gt_env
PPCODE:
{
XPUSHs(newSViv(gt_env->gtmEnvId));
}
void
getprefix(gt_env)
GtmEnv *gt_env
PPCODE:
{
strpack *x; unsigned i; EXTEND(SP,gt_env->pfx_elem);
if(gt_env->prefix) for(i=0;i<(gt_env->pfx_elem);i++) {
x=>_env->prefix[i]; PUSHs(newSVpvn(x->address, x->length));
}
}
( run in 0.592 second using v1.01-cache-2.11-cpan-71847e10f99 )