Db-GTM

 view release on metacpan or  search on metacpan

GTM.xs  view on Meta::CPAN

	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);

GTM.xs  view on Meta::CPAN

	    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); }

GTM.xs  view on Meta::CPAN

	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; }

GTM.xs  view on Meta::CPAN

	}

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); }

GTM.xs  view on Meta::CPAN

            }
	    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); 

GTM.xs  view on Meta::CPAN

	        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++) 

GTM.xs  view on Meta::CPAN

	  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")) { 

GTM.xs  view on Meta::CPAN

	  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); 

GTM.xs  view on Meta::CPAN

		    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);

GTM.xs  view on Meta::CPAN

              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); }

GTM.xs  view on Meta::CPAN

	    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=&gt_env->prefix[i]; PUSHs(newSVpvn(x->address, x->length));
          }
	}



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