Group
Extension

Neo4j-Bolt/lib/Neo4j/Bolt/NeoValue.xs

#include "perlbolt.h"
#include "ppport.h"

#define NVCLASS "Neo4j::Bolt::NeoValue"

struct neovalue {
  neo4j_value_t value;
};
typedef struct neovalue neovalue_t;

SV *_new_from_perl (const char* classname, SV *v) {
   SV *neosv, *neosv_ref;
   neovalue_t *obj;
   Newx(obj, 1, neovalue_t);
   obj->value = SV_to_neo4j_value(v);
   neosv = newSViv((IV) obj);
   neosv_ref = newRV_noinc(neosv);
   sv_bless(neosv_ref, gv_stashpv(classname, GV_ADD));
   SvREADONLY_on(neosv);
   return neosv_ref;
}

const char* _neotype (SV *obj) {
  neo4j_value_t v;
  v = C_PTR_OF(obj,neovalue_t)->value;
  return neo4j_typestr( neo4j_type( v ) );
}

SV* _as_perl (SV *obj) {
  SV *ret;
  ret = newSV(0);
  sv_setsv(ret,neo4j_value_to_SV( C_PTR_OF(obj, neovalue_t)->value ));
  return ret;
}

int _map_size (SV *obj) {
  return neo4j_map_size( C_PTR_OF(obj, neovalue_t)->value );
}

SV* is_bool (SV *sv) {
  SV *ref;
  if (! SvOK(sv)) {
    return &PL_sv_no;
  }
  SvGETMAGIC(sv);
  if (SvROK(sv)) {
    ref = SvRV(sv);
    if (SvTYPE(ref) < SVt_PVAV) { // scalar ref
      if (SvOBJECT(ref) && sv_isa(sv, "JSON::PP::Boolean")) {
        return &PL_sv_yes;
      }
      if (SvIOK(ref) && SvIV(ref) >> 1 == 0) { // literal \1 or \0
        return &PL_sv_yes;
      }
    }
  }
#if PERL_VERSION_GE(5,36,0)
  else if (SvIsBOOL(sv)) {
    return &PL_sv_yes;
  }
#endif
  return &PL_sv_no;
}

void DESTROY(SV *obj) {
  neo4j_value_t *val = C_PTR_OF(obj, neo4j_value_t);
  return;
}


MODULE = Neo4j::Bolt::NeoValue  PACKAGE = Neo4j::Bolt::NeoValue  

PROTOTYPES: DISABLE


SV *
_new_from_perl (classname, v)
	const char *	classname
	SV *	v

const char *
_neotype (obj)
	SV *	obj

SV *
_as_perl (obj)
	SV *	obj

int
_map_size (obj)
	SV *	obj

SV *
is_bool (obj)
	SV *	obj

void
DESTROY (obj)
	SV *	obj
        PREINIT:
        I32* temp;
        PPCODE:
        temp = PL_markstack_ptr++;
        DESTROY(obj);
        if (PL_markstack_ptr != temp) {
          /* truly void, because dXSARGS not invoked */
          PL_markstack_ptr = temp;
          XSRETURN_EMPTY; /* return empty stack */
        }
        /* must have used dXSARGS; list context implied */
        return; /* assume stack size is correct */



Powered by Groonga
Maintained by Kenichi Ishigaki <ishigaki@cpan.org>. If you find anything, submit it on GitHub.