1 /*
2   *
3   *     Copyright (c) 2000-2006 Alberto Reggiori <areggiori@webweaving.org>
4   *                        Dirk-Willem van Gulik <dirkx@webweaving.org>
5   *
6   * NOTICE
7   *
8   * This product is distributed under a BSD/ASF like license as described in the 'LICENSE'
9   * file you should have received together with this source code. If you did not get a
10   * a copy of such a license agreement you can pick up one at:
11   *
12   *     http://rdfstore.sourceforge.net/LICENSE
13 */
14 
15 #define PERL_NO_GET_CONTEXT
16 
17 #include "EXTERN.h"
18 #include "perl.h"
19 #include "XSUB.h"
20 
21 #ifdef PERL_IMPLICIT_CONTEXT
22 static PerlInterpreter *my_perl;
23 #endif
24 
25 #ifdef _NOT_CORE
26 #  include "ppport.h"
27 #endif
28 
29 #include "dbms.h"
30 #include "dbms_compat.h"
31 
32 #ifndef PERL_VERSION
33 #    include "patchlevel.h"
34 #    define PERL_REVISION       5
35 #    define PERL_VERSION        PATCHLEVEL
36 #    define PERL_SUBVERSION     SUBVERSION
37 #endif
38 
39 #if PERL_REVISION == 5 && (PERL_VERSION < 4 || (PERL_VERSION == 4 && PERL_SUBVERSION <= 75 ))
40 #    define PL_sv_undef         sv_undef
41 #    define PL_na               na
42 #endif
43 
44 #ifndef DB_VERSION_MAJOR
45 #undef __attribute__
46 #endif
47 
48 #ifdef op
49 #    undef op
50 #endif
51 
52 #if PERL_REVISION > 5 || (PERL_REVISION == 5 && PERL_VERSION >= 7)
53 
54 
55 #ifndef DB_VERSION_MAJOR
56 
57 /* Ditto for dXSARGS. */
58 #undef  dXSARGS
59 #define dXSARGS                             \
60         dSP; dMARK;                     \
61         I32 ax = mark - PL_stack_base + 1;      \
62         I32 items = sp - mark
63 
64 #endif
65 
66 #undef dXSI32
67 #define dXSI32 dNOOP
68 
69 #endif
70 
71 #include "dbms_comms.h"
72 
73 #include "rdfstore_log.h"
74 #include "rdfstore.h"
75 #include "rdfstore_iterator.h"
76 #include "rdfstore_serializer.h"
77 #include "rdfstore_utf8.h"
78 #include "rdfstore_digest.h"
79 
80 typedef RDF_Node * RDFStore_RDFNode;
81 typedef RDF_Statement * RDFStore_Statement;
82 typedef RDF_Triple_Pattern * RDFStore_Triple_Pattern;
83 typedef rdfstore * RDFStore;
84 typedef dbms * DBMS;
85 
86 /* this version interacts with $! in perl.. */
87 void
myerror(char * erm,int erx)88 myerror(char * erm, int erx ) {
89 #ifdef dTHX
90 	dTHX;
91 #endif
92         SV* sv = perl_get_sv("RDFStore::ERROR",TRUE);
93         SV* sv2 = perl_get_sv("!",TRUE);
94 
95         sv_setiv(sv, (IV) erx);
96         sv_setpv(sv, erm );
97         SvIOK_on(sv);
98 
99         sv_setiv(sv2, (IV) erx);
100         sv_setpv(sv2, erm );
101         SvIOK_on(sv2);
102 #if 0
103         fprintf(stderr,"RDFStore: ERROR %s\n",erm);
104 #endif
105 	}
106 
107 /* this version interacts with $! in perl.. */
108 void
set_dbms_error(char * erm,int erx)109 set_dbms_error(char * erm, int erx ) {
110 #ifdef dTHX
111 	dTHX;
112 #endif
113 	SV* sv = perl_get_sv("DBMS::ERROR",TRUE);
114 	SV* sv2 = perl_get_sv("!",TRUE);
115 
116 	sv_setiv(sv, (IV) erx);
117 	sv_setpv(sv, erm );
118 	SvIOK_on(sv);
119 
120 	sv_setiv(sv2, (IV) erx);
121 	sv_setpv(sv2, erm );
122 	SvIOK_on(sv2);
123 
124 #if 0
125 	fprintf(stderr,"DBMSD: ERROR %s\n",erm);
126 #endif
127 	}
128 
129 RDFStore_Statement
new_Statement_Object(SV * subject,SV * predicate,SV * object,SV * context,int isreified,SV * node)130 new_Statement_Object ( SV * subject, SV * predicate, SV * object, SV * context, int isreified, SV * node ) {
131         RDFStore_Statement ss=NULL;
132 
133 	if ( ! ( ( SvROK( subject ) ) &&
134 		 ( sv_isa( subject, "RDFStore::Resource") ) &&
135 		 ( SvROK( predicate ) ) &&
136 		 ( sv_isa( predicate, "RDFStore::Resource") ) &&
137 		 ( SvROK( object ) ) &&
138 		 (	( sv_isa( object, "RDFStore::Literal") ) ||
139 			( sv_isa( object, "RDFStore::Resource") ) ) ) ) {
140 		croak("new: Cannot create statement: invalid subject, predicate or object\n");
141 		return NULL;
142 		};
143 
144 	ss = rdfstore_statement_new(	rdfstore_resource_clone( (RDFStore_RDFNode)(SvIV(SvRV(subject))) ),
145 					rdfstore_resource_clone( (RDFStore_RDFNode)(SvIV(SvRV(predicate))) ),
146 					rdfstore_node_clone( (RDFStore_RDFNode)(SvIV(SvRV(object))) ),
147 					(	( context != NULL ) &&
148 						( context != &PL_sv_undef ) &&
149 						( SvTRUE(context) ) &&
150 						( SvROK(context) ) &&
151 						( sv_isa( context, "RDFStore::Resource") ) ) ?
152 							rdfstore_resource_clone( (RDFStore_RDFNode)(SvIV(SvRV(context))) ) : NULL,
153 					(	( node != NULL ) &&
154 						( node != &PL_sv_undef ) &&
155 						( SvTRUE(node) ) &&
156 						( SvROK(node) ) &&
157 						( sv_isa( node, "RDFStore::Resource") ) ) ?
158 							rdfstore_resource_clone( (RDFStore_RDFNode)(SvIV(SvRV(node))) ) : NULL,
159 					isreified );
160 
161 	return ss;
162 	};
163 
164 MODULE = RDFStore       PACKAGE = RDFStore::RDFNode     PREFIX = RDFStore_RDFNode_
165 
166 PROTOTYPES: DISABLE
167 
168 BOOT:
169 {
170 #ifdef dTHX
171   dTHX;
172 #endif
173   AV *isa = perl_get_av("RDFStore::RDFNode::ISA",1);
174   av_push(isa,newSVpv("RDFStore::Digest::Digestable",0));
175 };
176 
177 void
178 RDFStore_RDFNode_new ( package )
179 	SV*             package
180 
181         PREINIT:
182         	RDFStore_RDFNode mm;
183 		SV * node;
184 
185         PPCODE:
186                 if (!SvROK(package)) {
187                         STRLEN my_na;
188                         char *sclass = SvPV(package, my_na);
189 
190 			/* allocate mem for the node */
191 			mm = (RDFStore_RDFNode) rdfstore_node_new();
192 
193 			if (mm==NULL) {
194                         	XSRETURN_UNDEF;
195                 		};
196 
197                         /* bless() the node */
198                         node = sv_newmortal();
199                         sv_setref_pv( node, sclass, (void*)mm);
200                         SvREADONLY_on(SvRV(node));
201 
202 			XPUSHs( node );
203                 } else {
204                         /* just get through */
205                         mm = (RDFStore_RDFNode)SvIV(SvRV(package));
206                         };
207 
208                 XSRETURN(1);
209 
210 unsigned char *
211 RDFStore_RDFNode_getLabel ( me )
212         SV*             me
213 
214         PREINIT:
215                 RDFStore_RDFNode mm = (RDFStore_RDFNode)SvIV(SvRV(me));
216 		int ll=0;
217 
218         CODE:
219                 RETVAL = rdfstore_node_get_label( mm, &ll );
220         OUTPUT:
221                 RETVAL
222 
223 void
224 RDFStore_RDFNode_getDigest ( me )
225 	SV*		me
226 
227 	PREINIT:
228                 RDFStore_RDFNode mm = (RDFStore_RDFNode)SvIV(SvRV(me));
229 		int dl=0;
230 		unsigned char * dd=NULL;
231 
232 	PPCODE:
233         	dd = rdfstore_node_get_digest( mm, &dl );
234 		if (	( dd != NULL )  &&
235 			( dl > 0 ) ) {
236         		ST(0) = sv_2mortal( newSVpv( dd, dl ) );
237 			XSRETURN(1);
238 		} else {
239 			XSRETURN_UNDEF;
240 			};
241 
242 void
243 RDFStore_RDFNode_DESTROY( me )
244         SV*             me
245 
246         PREINIT:
247                 RDFStore_RDFNode mm = (RDFStore_RDFNode)SvIV(SvRV(me));
248 
249         CODE:
250 		rdfstore_node_free( mm );
251 
252 MODULE = RDFStore       PACKAGE = RDFStore::Resource     PREFIX = RDFStore_Resource_
253 
254 PROTOTYPES: DISABLE
255 
256 BOOT:
257 {
258 #ifdef dTHX
259   dTHX;
260 #endif
261   AV *isa = perl_get_av("RDFStore::Resource::ISA",1);
262   av_push(isa,newSVpv("RDFStore::RDFNode",0));
263 };
264 
265 void
266 RDFStore_Resource_new ( package, namespace, localname=NULL, bNode=0 )
267 	SV*             package
268 	unsigned char *		namespace
269 	unsigned char *		localname
270 	int		bNode
271 
272         PREINIT:
273         	RDFStore_RDFNode mm;
274 		SV * resource;
275 
276         PPCODE:
277                 if (!SvROK(package)) {
278                         STRLEN my_na;
279                         char *sclass = SvPV(package, my_na);
280 
281 			if (	( namespace != NULL ) &&
282 				( localname != NULL ) &&
283 				( strlen( localname ) > 0 ) ) {
284 				mm = rdfstore_resource_new_from_qname( namespace, strlen(namespace), localname, strlen(localname), (bNode) ? RDFSTORE_NODE_TYPE_BNODE : RDFSTORE_NODE_TYPE_RESOURCE );
285 			} else {
286 				if (	( namespace == NULL ) ||
287 					(       ( namespace != NULL ) &&
288 						( strlen( namespace ) <= 0 ) ) ) {
289                         		/* Resource identifier can not be null (empty) */
290                         		XSRETURN_UNDEF;
291 				} else {
292 					mm = rdfstore_resource_new( namespace, strlen(namespace), (bNode) ? RDFSTORE_NODE_TYPE_BNODE : RDFSTORE_NODE_TYPE_RESOURCE );
293 					};
294 				};
295 
296 			if ( mm == NULL ) {
297                         	XSRETURN_UNDEF;
298                 		};
299 
300                         /* re-bless() the node to a resource */
301                         resource = sv_newmortal();
302                         sv_setref_pv(resource, sclass, (void*)mm);
303                         SvREADONLY_on(SvRV(resource));
304 
305 			XPUSHs( resource );
306                 } else {
307                         /* just get through */
308                         mm = (RDFStore_RDFNode)SvIV(SvRV(package));
309                         };
310 
311                 XSRETURN(1);
312 
313 int
314 RDFStore_Resource_isAnonymous ( me )
315 	SV*		me
316 
317 	PREINIT:
318                 RDFStore_RDFNode mm = (RDFStore_RDFNode)SvIV(SvRV(me));
319 
320 	CODE:
321 		RETVAL = rdfstore_resource_is_anonymous( mm );
322 	OUTPUT:
323 		RETVAL
324 
325 void
326 RDFStore_Resource_getNamespace ( me )
327         SV*             me
328 
329         PREINIT:
330                 RDFStore_RDFNode mm = (RDFStore_RDFNode)SvIV(SvRV(me));
331 		int ll=0;
332 		unsigned char * ns=NULL;
333 
334         PPCODE:
335 		ns = rdfstore_resource_get_namespace( mm, &ll );
336 
337 		if ( ll <= 0 ) {
338 			XSRETURN_UNDEF;
339 			};
340 
341 		ST(0) = sv_2mortal( newSVpv( ns, ll ) );
342 
343                 XSRETURN(1);
344 
345 void
346 RDFStore_Resource_getLocalName ( me )
347         SV*             me
348 
349         PREINIT:
350                 RDFStore_RDFNode mm = (RDFStore_RDFNode)SvIV(SvRV(me));
351 		unsigned char * nc=NULL;
352 		int ll=0;
353 
354         PPCODE:
355 		nc = rdfstore_resource_get_localname( mm, &ll );
356 
357 		if (	( nc == NULL ) ||
358 			( ll <= 0 ) ) {
359 			XSRETURN_UNDEF;
360 			};
361 
362 		ST(0) = sv_2mortal( newSVpv( nc, ll ) );
363 
364 		XSRETURN(1);
365 
366 void
367 RDFStore_Resource_getbNode ( me )
368 	SV*		me
369 
370 	PREINIT:
371                 RDFStore_RDFNode mm = (RDFStore_RDFNode)SvIV(SvRV(me));
372 		unsigned char * bn=NULL;
373 		int ll=0;
374 
375 	PPCODE:
376 		bn = rdfstore_resource_get_bnode( mm, &ll );
377 
378 		if (	( bn == NULL ) ||
379 			( ll <= 0 ) ) {
380 			XSRETURN_UNDEF;
381 			};
382 
383 		XPUSHs( sv_2mortal(newSVpv( bn, ll )) );
384 
385 		XSRETURN(1);
386 
387 void
388 RDFStore_Resource_DESTROY( me )
389         SV*             me
390 
391         PREINIT:
392                 RDFStore_RDFNode mm = (RDFStore_RDFNode)SvIV(SvRV(me));
393 
394         CODE:
395 		rdfstore_resource_free( mm );
396 
397 MODULE = RDFStore       PACKAGE = RDFStore::Literal     PREFIX = RDFStore_Literal_
398 
399 PROTOTYPES: DISABLE
400 
401 BOOT:
402 {
403 #ifdef dTHX
404   dTHX;
405 #endif
406   AV *isa = perl_get_av("RDFStore::Literal::ISA",1);
407   av_push(isa,newSVpv("RDFStore::RDFNode",0));
408 };
409 
410 void
411 RDFStore_Literal_new ( package, content=NULL, parseType=0, lang=NULL, dataType=NULL )
412 	SV*             package
413 	unsigned char *          content
414 	int		parseType
415 	unsigned char *          lang
416 	unsigned char *		dataType
417 
418         PREINIT:
419         	RDFStore_RDFNode mm;
420 		SV * literal;
421 
422         PPCODE:
423                 if (!SvROK(package)) {
424                         STRLEN my_na;
425                         char *sclass = SvPV(package, my_na);
426 
427 			/* strlen() is not UTF8 safe - Perl does this with SvLEN() but must SV* ... */
428 			mm = rdfstore_literal_new( content, ( content != NULL ) ? strlen(content) : 0 , parseType, lang, dataType );
429 
430 			if ( mm == NULL ) {
431 				XSRETURN_UNDEF;
432                 		};
433 
434                         /* re-bless() the node to a literal */
435                         literal = sv_newmortal();
436                         sv_setref_pv( literal, sclass, (void*)mm);
437                         SvREADONLY_on(SvRV(literal));
438 
439 			XPUSHs( literal );
440                 } else {
441                         /* just get through */
442                         mm = (RDFStore_RDFNode)SvIV(SvRV(package));
443                         };
444 
445                 XSRETURN(1);
446 
447 int
448 RDFStore_Literal_getParseType ( me )
449 	SV*		me
450 
451 	PREINIT:
452                 RDFStore_RDFNode mm = (RDFStore_RDFNode)SvIV(SvRV(me));
453 
454 	CODE:
455 		RETVAL = rdfstore_literal_get_parsetype( mm );
456         OUTPUT:
457           	RETVAL
458 
459 unsigned char *
460 RDFStore_Literal_getLang ( me )
461 	SV*		me
462 
463 	PREINIT:
464                 RDFStore_RDFNode mm = (RDFStore_RDFNode)SvIV(SvRV(me));
465 
466 	CODE:
467 		RETVAL = rdfstore_literal_get_lang( mm );
468         OUTPUT:
469           	RETVAL
470 
471 unsigned char *
472 RDFStore_Literal_getDataType ( me )
473 	SV*		me
474 
475 	PREINIT:
476                 RDFStore_RDFNode mm = (RDFStore_RDFNode)SvIV(SvRV(me));
477 
478 	CODE:
479 		RETVAL = rdfstore_literal_get_datatype( mm );
480         OUTPUT:
481           	RETVAL
482 
483 void
484 RDFStore_Literal_DESTROY( me )
485         SV*             me
486 
487         PREINIT:
488                 RDFStore_RDFNode mm = (RDFStore_RDFNode)SvIV(SvRV(me));
489 
490         CODE:
491 		rdfstore_literal_free( mm );
492 
493 MODULE = RDFStore       PACKAGE = RDFStore::Statement     PREFIX = RDFStore_Statement_
494 
495 PROTOTYPES: DISABLE
496 
497 BOOT:
498 {
499 #ifdef dTHX
500   dTHX;
501 #endif
502   AV *isa = perl_get_av("RDFStore::Statement::ISA",1);
503   av_push(isa,newSVpv("RDFStore::Resource",0));
504 };
505 
506 void
507 RDFStore_Statement_new ( package, subject, predicate, object, context=NULL, isreified=0, identifier=NULL )
508 	SV*     package
509 	SV*	subject
510 	SV*	predicate
511 	SV*	object
512 	SV*	context
513 	int	isreified
514 	SV*	identifier
515 
516         PREINIT:
517         	RDFStore_Statement mm;
518 		SV * statement;
519 
520         PPCODE:
521                 if (!SvROK(package)) {
522                         STRLEN my_na;
523                         char *sclass = SvPV(package, my_na);
524 
525 			mm = new_Statement_Object( subject, predicate, object, context, isreified, identifier );
526 
527 			if ( mm == NULL ) {
528 				XSRETURN_UNDEF;
529                 		};
530 
531                         /* re-bless() the node to a literal */
532                         statement = sv_newmortal();
533                         sv_setref_pv( statement, sclass, (void*)mm);
534                         SvREADONLY_on(SvRV(statement));
535 
536 			XPUSHs( statement );
537                 } else {
538                         /* just get through */
539                         mm = (RDFStore_Statement)SvIV(SvRV(package));
540                         };
541 
542                 XSRETURN(1);
543 
544 int
545 RDFStore_Statement_isReified ( me )
546 	SV*		me
547 
548 	PREINIT:
549                 RDFStore_Statement mm = (RDFStore_Statement)SvIV(SvRV(me));
550 
551 	CODE:
552 
553 		RETVAL = rdfstore_statement_isreified( mm );
554 
555 	OUTPUT:
556 		RETVAL
557 
558 void
559 RDFStore_Statement_subject ( me )
560 	SV*		me
561 
562 	PREINIT:
563                 RDFStore_Statement mm = (RDFStore_Statement)SvIV(SvRV(me));
564 		RDFStore_RDFNode nn=NULL;
565 		SV * node;
566 
567 	PPCODE:
568 		nn  = rdfstore_statement_get_subject( mm );
569 
570 		if ( nn != NULL ) {
571 			/* bless() the node */
572                         node = sv_newmortal();
573                         sv_setref_pv( node, "RDFStore::Resource", (void*) rdfstore_resource_clone( nn ) );
574                         SvREADONLY_on(SvRV(node));
575 
576 			XPUSHs( node );
577 
578 			XSRETURN(1);
579 		} else {
580 			XSRETURN_UNDEF;
581 			};
582 
583 void
584 RDFStore_Statement_predicate ( me )
585 	SV*		me
586 
587 	PREINIT:
588                 RDFStore_Statement mm = (RDFStore_Statement)SvIV(SvRV(me));
589 		RDFStore_RDFNode nn=NULL;
590 		SV * node;
591 
592 	PPCODE:
593 		nn  = rdfstore_statement_get_predicate( mm );
594 
595                 if ( nn != NULL ) {
596                         /* bless() the node */
597                         node = sv_newmortal();
598                         sv_setref_pv( node, "RDFStore::Resource", (void*) rdfstore_resource_clone( nn ) );
599                         SvREADONLY_on(SvRV(node));
600 
601 			XPUSHs( node );
602 
603                         XSRETURN(1);
604                 } else {
605 			XSRETURN_UNDEF;
606                         };
607 
608 void
609 RDFStore_Statement_object ( me )
610 	SV*		me
611 
612 	PREINIT:
613                 RDFStore_Statement mm = (RDFStore_Statement)SvIV(SvRV(me));
614 		RDFStore_RDFNode nn=NULL;
615 		SV * node;
616 
617 	PPCODE:
618 		nn  = rdfstore_statement_get_object( mm );
619 
620                 if ( nn != NULL ) {
621                         /* bless() the node */
622                         node = sv_newmortal();
623                         if (  rdfstore_node_get_type( nn ) != RDFSTORE_NODE_TYPE_LITERAL ) {
624                         	sv_setref_pv( node, "RDFStore::Resource", (void*) rdfstore_resource_clone( nn ) );
625 			} else {
626                         	sv_setref_pv( node, "RDFStore::Literal", (void*) rdfstore_literal_clone( nn ) );
627 				};
628                         SvREADONLY_on(SvRV(node));
629 
630 			XPUSHs( node );
631 
632                         XSRETURN(1);
633                 } else {
634 			XSRETURN_UNDEF;
635                         };
636 
637 void
638 RDFStore_Statement_context ( me )
639 	SV*		me
640 
641 	PREINIT:
642                 RDFStore_Statement mm = (RDFStore_Statement)SvIV(SvRV(me));
643 		RDFStore_RDFNode nn=NULL;
644 		SV * node;
645 
646 	PPCODE:
647 		nn  = rdfstore_statement_get_context( mm );
648 
649                 if ( nn != NULL ) {
650                        	/* bless() the node */
651                        	node = sv_newmortal();
652                        	sv_setref_pv( node, "RDFStore::Resource", (void*) rdfstore_resource_clone( nn ) );
653                        	SvREADONLY_on(SvRV(node));
654 
655 			XPUSHs( node );
656 
657                        	XSRETURN(1);
658                	} else {
659 			XSRETURN_UNDEF;
660                        	};
661 
662 void
663 RDFStore_Statement_getDigest ( me )
664 	SV*		me
665 
666 	PREINIT:
667                 RDFStore_Statement mm = (RDFStore_Statement)SvIV(SvRV(me));
668 		unsigned char * dd = NULL;
669 		int dl=0;
670 
671 	PPCODE:
672         	dd = rdfstore_statement_get_digest( mm, &dl );
673 		if (	( dd != NULL )  &&
674 			( dl > 0 ) ) {
675 			ST(0) = sv_2mortal( newSVpv( dd, dl ) );
676 			XSRETURN(1);
677 		} else {
678 			XSRETURN_UNDEF;
679 			};
680 
681 void
682 RDFStore_Statement_toString ( me )
683         SV*             me
684 
685         PREINIT:
686                 RDFStore_Statement mm = (RDFStore_Statement)SvIV(SvRV(me));
687 		unsigned char *	ntriples_rep=NULL;
688 		int nl=0;
689 
690         PPCODE:
691 		ntriples_rep = rdfstore_statement_to_string( mm, &nl );
692 
693 		if (	( ntriples_rep == NULL ) ||
694 			( nl <= 0 ) )
695 			XSRETURN_UNDEF;
696 
697                 ST(0) = sv_2mortal(newSVpv( ntriples_rep, nl ));
698 
699                 RDFSTORE_FREE( ntriples_rep );
700 
701                 XSRETURN(1);
702 
703 void
704 RDFStore_Statement_getLabel ( me )
705         SV*             me
706 
707         PREINIT:
708                 RDFStore_Statement mm = (RDFStore_Statement)SvIV(SvRV(me));
709 		unsigned char * label=NULL;
710 		int ll=0;
711 
712         PPCODE:
713                 label = rdfstore_statement_get_label( mm, &ll );
714 
715 		if (	( label == NULL ) ||
716 			( ll <= 0 ) )
717 			XSRETURN_UNDEF;
718 		ST(0) = sv_2mortal(newSVpv(label,ll));
719 
720 		XSRETURN(1);
721 
722 void
723 RDFStore_Statement_DESTROY( me )
724         SV*             me
725 
726         PREINIT:
727                 RDFStore_Statement mm = (RDFStore_Statement)SvIV(SvRV(me));
728 
729         CODE:
730 		rdfstore_statement_free( mm );
731 
732 MODULE = RDFStore	PACKAGE = RDFStore	PREFIX = RDFStore_
733 
734 PROTOTYPES: DISABLE
735 
736 int
737 RDFStore_if_modified_since ( name=NULL, since )
738 	char *	name
739 	char *	since
740 
741 	PREINIT:
742 		int status=0;
743 
744 	CODE:
745 		status=rdfstore_if_modified_since( name, since, NULL,NULL,NULL,&myerror );
746 
747                 RETVAL = (status) ? 0 : 1;
748         OUTPUT:
749           	RETVAL
750 
751 void
752 RDFStore_new ( package, directory="", flags=0, freetext=0, sync=0, remote=0, host=DBMS_HOST,port=DBMS_PORT )
753         SV*             package
754 	char *          directory
755 	int             flags
756 	int             freetext
757 	int             sync
758 	int             remote
759 	char *          host
760 	int		port
761 
762         PREINIT:
763                 RDFStore mm;
764 		SV * store;
765 
766         PPCODE:
767                 if (!SvROK(package)) {
768                         /* bless() the store cursor */
769                         STRLEN my_na;
770                         char *sclass = SvPV(package, my_na);
771 
772                         /* connect */
773 			if ( rdfstore_connect( &mm, directory, flags, ( freetext ? freetext : 0 ),( sync ? sync : 0 ),( remote ? remote : 0 ), host, port, NULL,NULL,NULL,&myerror ) != 0 ) {
774 				XSRETURN_UNDEF;
775                                 };
776 
777                         store = sv_newmortal();
778                         sv_setref_pv( store, sclass, (void*)mm);
779                         SvREADONLY_on(SvRV(store));
780 
781 			XPUSHs( store );
782                 } else {
783                         /* just get through */
784                         mm = (RDFStore)SvIV(SvRV(package));
785                         };
786 
787                 XSRETURN(1);
788 
789 void
790 RDFStore_debug_malloc_dump()
791     CODE:
792 #ifdef RDFSTORE_DEBUG_MALLOC
793 	rdfstore_log_debug_malloc_dump();
794 #endif
795 
796 void
797 RDFStore_DESTROY( me )
798         SV*             me
799 
800         PREINIT:
801                 RDFStore mm = (RDFStore)SvIV(SvRV(me));
802 
803         CODE:
804 		/* disconnect and free if necessary */
805 		rdfstore_disconnect( mm );
806 
807 unsigned int
808 RDFStore_size( me )
809         SV*             me
810 
811 	PREINIT:
812                 RDFStore mm = (RDFStore)SvIV(SvRV(me));
813 
814 	CODE:
815 
816         	if ( rdfstore_size( mm, &RETVAL ) ) {
817                 	XSRETURN_UNDEF;
818 			};
819 
820         OUTPUT:
821                 RETVAL
822 
823 int
824 RDFStore_insert ( me, subject, predicate=NULL, object=NULL, context=NULL )
825         SV*             me
826         SV*             subject
827         SV*             predicate
828         SV*             object
829         SV*             context
830 
831 	PREINIT:
832                 RDFStore mm = (RDFStore)SvIV(SvRV(me));
833 		int status=0;
834 		RDFStore_Statement statement;
835 
836 	CODE:
837 		if ( !  ( ( subject != NULL ) &&
838                           ( subject != &PL_sv_undef ) &&
839                           ( SvTRUE(subject) ) &&
840 			  ( SvROK(subject) ) &&
841                           (     ( sv_isa( subject, "RDFStore::Resource") ) ||
842                                 ( sv_isa( subject, "RDFStore::Statement") ) ) ) ) {
843                         croak("insert: Invalid subject or statement\n");
844                         XSRETURN_UNDEF;
845                         };
846                 if (	( predicate != NULL ) &&
847 			( predicate != &PL_sv_undef ) &&
848 			( SvTRUE(predicate) ) ) {
849 			if ( ! ( ( SvROK(predicate) ) &&
850                         	 ( sv_isa( predicate, "RDFStore::Resource") ) ) ) {
851                         	croak("insert: Invalid predicate\n");
852                         	XSRETURN_UNDEF;
853                         	};
854                         };
855                 if (	( object != NULL ) &&
856 			( object != &PL_sv_undef ) &&
857 			( SvTRUE(object) ) ) {
858 			if ( ! ( ( SvROK(object) ) &&
859                         	 (	( sv_isa( object, "RDFStore::Literal") ) ||
860 					( sv_isa( object, "RDFStore::Resource") ) ) ) ) {
861                         	croak("insert: Invalid object\n");
862                         	XSRETURN_UNDEF;
863                         	};
864                         };
865 		if (	( context != NULL ) &&
866 			( context != &PL_sv_undef ) &&
867 			( SvTRUE(context) ) ) {
868 			if ( ! ( ( SvROK(context) ) &&
869                         	 ( sv_isa( context, "RDFStore::Resource") ) ) ) {
870                         	croak("insert: Invalid statement context\n");
871                         	XSRETURN_UNDEF;
872                         	};
873                         };
874 
875 		/* create a temporary statement */
876                 if ( ! sv_isa( ST(1), "RDFStore::Statement") ) {
877 			statement = new_Statement_Object( subject, predicate, object, NULL, 0, NULL );
878 			if ( statement == NULL ) {
879                                 XSRETURN_UNDEF;
880                 		};
881 		} else {
882 			statement = ((RDFStore_Statement)SvIV(SvRV(ST(1))));
883 			};
884 
885 		status=rdfstore_insert( mm, statement, ( ( context != NULL ) && ( context != &PL_sv_undef ) && ( SvROK( context ) ) ) ? (RDFStore_RDFNode)SvIV(SvRV(context)) : NULL );
886 
887                 if ( ! sv_isa( ST(1), "RDFStore::Statement") ) {
888 			rdfstore_statement_free( statement );
889 			};
890 
891                 RETVAL = (status) ? 0 : 1;
892         OUTPUT:
893           	RETVAL
894 
895 int
896 RDFStore_remove ( me, subject, predicate=NULL, object=NULL, context=NULL )
897         SV*             me
898         SV*             subject
899         SV*             predicate
900         SV*             object
901         SV*             context
902 
903         PREINIT:
904                 RDFStore mm = (RDFStore)SvIV(SvRV(me));
905                 int status=0;
906                 RDF_Statement *	statement;
907 
908         CODE:
909 		if ( !  ( ( subject != NULL ) &&
910                           ( subject != &PL_sv_undef ) &&
911                           ( SvTRUE(subject) ) &&
912                           ( SvROK(subject) ) &&
913                           (     ( sv_isa( subject, "RDFStore::Resource") ) ||
914                                 ( sv_isa( subject, "RDFStore::Statement") ) ) ) ) {
915                         croak("remove: Invalid subject or statement\n");
916                         XSRETURN_UNDEF;
917                         };
918 		if (    ( predicate != NULL ) &&
919                         ( predicate != &PL_sv_undef ) &&
920 			( SvTRUE(predicate) ) ) {
921                         if ( ! ( ( SvROK(predicate) ) &&
922                                  ( sv_isa( predicate, "RDFStore::Resource") ) ) ) {
923                                 croak("remove: Invalid predicate\n");
924                                 XSRETURN_UNDEF;
925                                 };
926                         };
927                 if (    ( object != NULL ) &&
928                         ( object != &PL_sv_undef ) &&
929 			( SvTRUE(object) ) ) {
930                         if ( ! ( ( SvROK(object) ) &&
931                                  (      ( sv_isa( object, "RDFStore::Literal") ) ||
932                                         ( sv_isa( object, "RDFStore::Resource") ) ) ) ) {
933                                 croak("remove: Invalid object\n");
934                                 XSRETURN_UNDEF;
935                                 };
936                         };
937                 if (    ( context != NULL ) &&
938                         ( context != &PL_sv_undef ) &&
939 			( SvTRUE(context) ) ) {
940                         if ( ! ( ( SvROK(context) ) &&
941                                  ( sv_isa( context, "RDFStore::Resource") ) ) ) {
942                                 croak("remove: Invalid statement context\n");
943                                 XSRETURN_UNDEF;
944                                 };
945                         };
946 
947 		/* create a temporary statement */
948 		if ( ! sv_isa( ST(1), "RDFStore::Statement") ) {
949 			statement = new_Statement_Object( subject, predicate, object, NULL, 0, NULL );
950                         if ( statement == NULL ) {
951                                 XSRETURN_UNDEF;
952                                 };
953                 } else {
954                         statement = ((RDFStore_Statement)SvIV(SvRV(ST(1))));
955                         };
956 
957                 status=rdfstore_remove( mm, statement, ( ( context != NULL ) && ( context != &PL_sv_undef ) && ( SvROK( context ) ) ) ? (RDFStore_RDFNode)SvIV(SvRV(context)) : NULL );
958 
959                 if ( ! sv_isa( ST(1), "RDFStore::Statement") ) {
960 			rdfstore_statement_free( statement );
961                         };
962 
963                 RETVAL = (status) ? 0 : 1;
964         OUTPUT:
965                 RETVAL
966 
967 int
968 RDFStore_contains ( me, subject, predicate=NULL, object=NULL, context=NULL )
969         SV*             me
970         SV*             subject
971         SV*             predicate
972         SV*             object
973         SV*             context
974 
975         PREINIT:
976                 RDFStore mm = (RDFStore)SvIV(SvRV(me));
977                 int status=0;
978                 RDF_Statement *	statement;
979 
980         CODE:
981 		if ( !  ( ( subject != NULL ) &&
982                           ( subject != &PL_sv_undef ) &&
983                           ( SvTRUE(subject) ) &&
984                           ( SvROK(subject) ) &&
985                           (     ( sv_isa( subject, "RDFStore::Resource") ) ||
986                                 ( sv_isa( subject, "RDFStore::Statement") ) ) ) ) {
987                         croak("contains: Invalid subject or statement\n");
988                         XSRETURN_UNDEF;
989                         };
990 		if (    ( predicate != NULL ) &&
991                         ( predicate != &PL_sv_undef ) &&
992 			( SvTRUE(predicate) ) ) {
993                         if ( ! ( ( SvROK(predicate) ) &&
994                                  ( sv_isa( predicate, "RDFStore::Resource") ) ) ) {
995                                 croak("contains: Invalid predicate\n");
996                                 XSRETURN_UNDEF;
997                                 };
998                         };
999                 if (    ( object != NULL ) &&
1000                         ( object != &PL_sv_undef ) &&
1001 			( SvTRUE(object) ) ) {
1002                         if ( ! ( ( SvROK(object) ) &&
1003                                  (      ( sv_isa( object, "RDFStore::Literal") ) ||
1004                                         ( sv_isa( object, "RDFStore::Resource") ) ) ) ) {
1005                                 croak("contains: Invalid object\n");
1006                                 XSRETURN_UNDEF;
1007                                 };
1008                         };
1009                 if (    ( context != NULL ) &&
1010                         ( context != &PL_sv_undef ) &&
1011 			( SvTRUE(context) ) ) {
1012                         if ( ! ( ( SvROK(context) ) &&
1013                                  ( sv_isa( context, "RDFStore::Resource") ) ) ) {
1014                                 croak("contains: Invalid statement context\n");
1015                                 XSRETURN_UNDEF;
1016                                 };
1017                         };
1018 
1019                 /* create a temporary statement */
1020 		if ( ! sv_isa( ST(1), "RDFStore::Statement") ) {
1021 			statement = new_Statement_Object( subject, predicate, object, NULL, 0, NULL );
1022                         if ( statement == NULL ) {
1023                                 XSRETURN_UNDEF;
1024                                 };
1025                 } else {
1026                         statement = ((RDFStore_Statement)SvIV(SvRV(ST(1))));
1027                         };
1028 
1029                 status=rdfstore_contains( mm, statement, ( ( context != NULL ) && ( context != &PL_sv_undef ) && ( SvROK( context ) ) ) ? (RDFStore_RDFNode)SvIV(SvRV(context)) : NULL );
1030 
1031                 if ( ! sv_isa( ST(1), "RDFStore::Statement") ) {
1032 			rdfstore_statement_free( statement );
1033                         };
1034 
1035                 RETVAL = (status) ? 0 : 1;
1036         OUTPUT:
1037                 RETVAL
1038 
1039 void
1040 RDFStore_set_context ( me, given_context )
1041 	SV*		me
1042 	SV*		given_context
1043 
1044 	PREINIT:
1045 		RDFStore mm = (RDFStore)SvIV(SvRV(me));
1046 		int status=0;
1047 		RDFStore_RDFNode nn=NULL;
1048 
1049 	PPCODE:
1050 		if ( ! ( ( SvROK(given_context) ) &&
1051                          ( sv_isa( given_context, "RDFStore::Resource") ) ) ) {
1052                         croak("set_context: Invalid statement context\n");
1053 			XSRETURN_UNDEF;
1054                         };
1055 
1056                 nn = (RDFStore_RDFNode)SvIV(SvRV(given_context));
1057 
1058 		status=rdfstore_set_context( mm, nn );
1059 
1060 		ST(0) = sv_2mortal( newSViv( (status) ? 0 : 1 ) );
1061 
1062 		XSRETURN(1);
1063 
1064 int
1065 RDFStore_reset_context ( me )
1066 	SV*		me
1067 
1068 	PREINIT:
1069 		RDFStore mm = (RDFStore)SvIV(SvRV(me));
1070 		int status=0;
1071 
1072 	CODE:
1073 		status=rdfstore_reset_context( mm );
1074 
1075                 RETVAL = (status) ? 0 : 1;
1076         OUTPUT:
1077           	RETVAL
1078 
1079 void
1080 RDFStore_get_context ( me )
1081 	SV*		me
1082 
1083 	PREINIT:
1084 		RDFStore mm = (RDFStore)SvIV(SvRV(me));
1085         	RDFStore_RDFNode	context=NULL;
1086 		SV * node;
1087 
1088 	PPCODE:
1089 		context=rdfstore_get_context( mm );
1090 
1091                 if ( context != NULL )  {
1092 
1093 			/* bless() the context into a resource */
1094                         node = sv_newmortal();
1095                         sv_setref_pv( node, "RDFStore::Resource", (void*) rdfstore_resource_clone(context) );
1096                         SvREADONLY_on(SvRV(node));
1097 
1098 			XPUSHs( node );
1099 
1100                 	XSRETURN(1);
1101 		} else {
1102 			XSRETURN_UNDEF;
1103 			};
1104 
1105 int
1106 RDFStore_set_source_uri ( me, uri )
1107 	SV*		me
1108 	SV*		uri
1109 
1110 	PREINIT:
1111 		RDFStore mm = (RDFStore)SvIV(SvRV(me));
1112 		int status=0;
1113 
1114 	CODE:
1115 		if ( ( SvPOK(ST(1)) && SvCUR(ST(1)) ) ) {
1116 			status=rdfstore_set_source_uri( mm, SvPV(uri, SvLEN(uri) ) );
1117 		} else {
1118 			status = 0;
1119 			};
1120 
1121                 RETVAL = (status) ? 0 : 1;
1122         OUTPUT:
1123           	RETVAL
1124 
1125 void
1126 RDFStore_get_source_uri ( me )
1127 	SV*		me
1128 
1129 	PREINIT:
1130 		RDFStore mm = (RDFStore)SvIV(SvRV(me));
1131 		int status=0;
1132 		char	uri[RDFSTORE_MAX_URI_LENGTH];
1133 		int	ll=0;
1134 
1135 	PPCODE:
1136 		status=rdfstore_get_source_uri( mm, uri ); /* should return the len too due to UTF-8 story... */
1137 
1138 		if ( status )
1139 			XSRETURN_UNDEF;
1140 		ll = strlen(uri);
1141 
1142 		ST(0) = sv_2mortal(newSVpv(uri,ll));
1143 
1144 		XSRETURN(1);
1145 
1146 int
1147 RDFStore_is_empty ( me )
1148 	SV*		me
1149 
1150 	PREINIT:
1151 		RDFStore mm = (RDFStore)SvIV(SvRV(me));
1152 		int status=0;
1153 
1154 	CODE:
1155 		status=rdfstore_is_empty( mm );
1156 
1157                 RETVAL = (status) ? 0 : 1;
1158         OUTPUT:
1159           	RETVAL
1160 
1161 int
1162 RDFStore_is_connected ( me )
1163 	SV*		me
1164 
1165 	PREINIT:
1166 		RDFStore mm = (RDFStore)SvIV(SvRV(me));
1167 		int status=0;
1168 
1169 	CODE:
1170 		status=rdfstore_isconnected( mm );
1171 
1172                 RETVAL = (status) ? 0 : 1;
1173         OUTPUT:
1174           	RETVAL
1175 
1176 int
1177 RDFStore_is_remote ( me )
1178 	SV*		me
1179 
1180 	PREINIT:
1181 		RDFStore mm = (RDFStore)SvIV(SvRV(me));
1182 		int status=0;
1183 
1184 	CODE:
1185 		status=rdfstore_isremote( mm );
1186 
1187                 RETVAL = (status) ? 0 : 1;
1188         OUTPUT:
1189           	RETVAL
1190 
1191 void
1192 RDFStore_elements ( me )
1193 	SV*		me
1194 
1195 	PREINIT:
1196 		RDFStore mm = (RDFStore)SvIV(SvRV(me));
1197 		RDFStore_Iterator       cc;
1198 		SV * iterator;
1199 
1200 	PPCODE:
1201                 cc = rdfstore_elements( mm );
1202 
1203 		if ( cc != NULL ) {
1204                 	iterator = sv_newmortal();
1205                 	sv_setref_pv( iterator, "RDFStore::Iterator", (void*)cc);
1206                 	SvREADONLY_on(SvRV(iterator));
1207 
1208 			XPUSHs( iterator );
1209 
1210 			XSRETURN(1);
1211 		} else {
1212 			XSRETURN_UNDEF;
1213 			};
1214 
1215 void
1216 RDFStore_search( me, rpn=NULL )
1217 	SV*		me
1218 	SV*		rpn
1219 
1220 	PREINIT:
1221 		RDFStore mm = (RDFStore)SvIV(SvRV(me));
1222 		int i=0;
1223 		RDF_Triple_Pattern *	tp=NULL;
1224 		STRLEN			len;
1225 		RDFStore_Iterator	cc;
1226 		SV * iterator;
1227 		SV ** hval=NULL;
1228 		AV * list=NULL;
1229 		SV * node=NULL;
1230 		int search_type=0;
1231 
1232 	PPCODE:
1233 		if( ! SvROK(rpn) )
1234 			XSRETURN_UNDEF;
1235 
1236 		tp = rdfstore_triple_pattern_new();
1237 
1238 		if ( tp == NULL ) {
1239 			XSRETURN_UNDEF;
1240 			};
1241 
1242 		hval = hv_fetch( (HV*) SvRV(rpn), "s", 1, 0);
1243 		if(	hval &&
1244 			SvROK(*hval) &&
1245 			(SvTYPE(SvRV(*hval)) == SVt_PVAV) ) {
1246 			list = (AV*) SvRV(*hval);
1247 			for(i=0;i<=av_len(list);i++) {
1248 				node = *av_fetch(list, i, 0);
1249 				if (	( node != NULL ) &&
1250 					( node != &PL_sv_undef ) &&
1251 					( SvTRUE(node) ) ) {
1252                         			if ( ! ( ( SvROK(node) ) &&
1253                                  			 ( sv_isa( node, "RDFStore::Resource") ) ) ) {
1254                                 			croak("search: Invalid subject at pos %d\n",i);
1255 							rdfstore_triple_pattern_free(tp);
1256 							XSRETURN_UNDEF;
1257 						} else {
1258 							rdfstore_triple_pattern_add_subject( tp, rdfstore_node_clone( (RDFStore_RDFNode)SvIV(SvRV(node)) ) );
1259                                 			};
1260                         			};
1261 				};
1262 			};
1263 		hval = hv_fetch( (HV*) SvRV(rpn), "p", 1, 0);
1264 		if(	hval &&
1265 			SvROK(*hval) &&
1266 			(SvTYPE(SvRV(*hval)) == SVt_PVAV) ) {
1267 			list = (AV*) SvRV(*hval);
1268 			for(i=0;i<=av_len(list);i++) {
1269 				node = *av_fetch(list, i, 0);
1270 				if (	( node != NULL ) &&
1271 					( node != &PL_sv_undef ) &&
1272 					( SvTRUE(node) ) ) {
1273                         			if ( ! ( ( SvROK(node) ) &&
1274                                  			 ( sv_isa( node, "RDFStore::Resource") ) ) ) {
1275                                 			croak("search: Invalid predicate at pos %d\n",i);
1276 							rdfstore_triple_pattern_free(tp);
1277 							XSRETURN_UNDEF;
1278 						} else {
1279 							rdfstore_triple_pattern_add_predicate( tp, rdfstore_node_clone( (RDFStore_RDFNode)SvIV(SvRV(node)) ) );
1280                                 			};
1281                         			};
1282 				};
1283 			};
1284 		hval = hv_fetch( (HV*) SvRV(rpn), "o", 1, 0);
1285 		if(	hval &&
1286 			SvROK(*hval) &&
1287 			(SvTYPE(SvRV(*hval)) == SVt_PVAV) ) {
1288 			list = (AV*) SvRV(*hval);
1289 			for(i=0;i<=av_len(list);i++) {
1290 				node = *av_fetch(list, i, 0);
1291 				if (	( node != NULL ) &&
1292 					( node != &PL_sv_undef ) &&
1293 					( SvTRUE(node) ) ) {
1294                         			if ( ! ( ( SvROK(node) ) &&
1295                                  			 ( ( sv_isa( node, "RDFStore::Literal") ) ||
1296 							   ( sv_isa( node, "RDFStore::Resource") ) ) ) ) {
1297                                 			croak("search: Invalid object at pos %d\n",i);
1298 							rdfstore_triple_pattern_free(tp);
1299 							XSRETURN_UNDEF;
1300 						} else {
1301 							rdfstore_triple_pattern_add_object( tp, rdfstore_node_clone( (RDFStore_RDFNode)SvIV(SvRV(node)) ) );
1302                                 			};
1303                         			};
1304 				};
1305 			};
1306 		hval = hv_fetch( (HV*) SvRV(rpn), "c", 1, 0);
1307 		if(	hval &&
1308 			SvROK(*hval) &&
1309 			(SvTYPE(SvRV(*hval)) == SVt_PVAV) ) {
1310 			list = (AV*) SvRV(*hval);
1311 			for(i=0;i<=av_len(list);i++) {
1312 				node = *av_fetch(list, i, 0);
1313 				if (	( node != NULL ) &&
1314 					( node != &PL_sv_undef ) &&
1315 					( SvTRUE(node) ) ) {
1316                         			if ( ! ( ( SvROK(node) ) &&
1317                                  			 ( sv_isa( node, "RDFStore::Resource") ) ) ) {
1318                                 			croak("search: Invalid context at pos %d\n",i);
1319 							rdfstore_triple_pattern_free(tp);
1320 							XSRETURN_UNDEF;
1321 						} else {
1322 							rdfstore_triple_pattern_add_context( tp, rdfstore_node_clone( (RDFStore_RDFNode)SvIV(SvRV(node)) ) );
1323                                 			};
1324                         			};
1325 				};
1326 			};
1327 
1328 		hval = hv_fetch( (HV*) SvRV(rpn), "xml:lang", 8, 0);
1329 		if(	hval &&
1330 			SvROK(*hval) &&
1331 			(SvTYPE(SvRV(*hval)) == SVt_PVAV) ) {
1332 			list = (AV*) SvRV(*hval);
1333 			for(i=0;i<=av_len(list);i++) {
1334 				node = *av_fetch(list, i, 0);
1335 				if (	( node != NULL ) &&
1336 					( node != &PL_sv_undef ) &&
1337 					SvTRUE(node) &&
1338 					SvPOK(node) &&
1339 					SvCUR(node) ) {
1340 					rdfstore_triple_pattern_add_lang( tp, (unsigned char *)(SvPV(node,len)) );
1341                         		};
1342 				};
1343 			};
1344 		hval = hv_fetch( (HV*) SvRV(rpn), "rdf:datatype", 12, 0);
1345 		if(	hval &&
1346 			SvROK(*hval) &&
1347 			(SvTYPE(SvRV(*hval)) == SVt_PVAV) ) {
1348 			list = (AV*) SvRV(*hval);
1349 			for(i=0;i<=av_len(list);i++) {
1350 				node = *av_fetch(list, i, 0);
1351 				if (	( node != NULL ) &&
1352 					( node != &PL_sv_undef ) &&
1353 					SvTRUE(node) &&
1354 					SvPOK(node) &&
1355 					SvCUR(node) ) {
1356 					unsigned char * ddtt = (unsigned char *)(SvPV(node,len));
1357 					rdfstore_triple_pattern_add_datatype( tp, ddtt, len );
1358                         		};
1359 				};
1360 			};
1361 		hval = hv_fetch( (HV*) SvRV(rpn), "words", 5, 0);
1362 		if(	hval &&
1363 			SvROK(*hval) &&
1364 			(SvTYPE(SvRV(*hval)) == SVt_PVAV) ) {
1365 			list = (AV*) SvRV(*hval);
1366 			for(i=0;i<=av_len(list);i++) {
1367 				node = *av_fetch(list, i, 0);
1368 				if (	( node != NULL ) &&
1369 					( node != &PL_sv_undef ) &&
1370 					SvTRUE(node) &&
1371 					SvPOK(node) &&
1372 					SvCUR(node) ) {
1373 					unsigned char * word = (unsigned char *)(SvPV(node,len));
1374 					rdfstore_triple_pattern_add_word( tp, word, len );
1375                         		};
1376 				};
1377 			};
1378 		hval = hv_fetch( (HV*) SvRV(rpn), "ranges", 6, 0);
1379 		if(	hval &&
1380 			SvROK(*hval) &&
1381 			(SvTYPE(SvRV(*hval)) == SVt_PVAV) ) {
1382 			list = (AV*) SvRV(*hval);
1383 			for(i=0;i<=av_len(list);i++) {
1384 				node = *av_fetch(list, i, 0);
1385 				if (	( node != NULL ) &&
1386 					( node != &PL_sv_undef ) &&
1387 					SvTRUE(node) &&
1388 					SvPOK(node) &&
1389 					SvCUR(node) ) {
1390 					unsigned char * term = (unsigned char *)(SvPV(node,len));
1391 					rdfstore_triple_pattern_add_ranges( tp, term, len );
1392                         		};
1393 				};
1394 			};
1395 
1396 		hval = hv_fetch( (HV*) SvRV(rpn), "s_op", 4, 0);
1397 		if(	hval &&
1398 			SvPOK(*hval) ) {
1399 			unsigned char * op = (unsigned char *)(SvPV(*hval,len));
1400 			rdfstore_triple_pattern_set_subjects_operator( tp, (	(strcmp(op,"and")==0) ||
1401 										(strcmp(op,"AND")==0) ||
1402 										(strcmp(op,"&")==0) ) ? 1 : 0 );
1403 			};
1404 		hval = hv_fetch( (HV*) SvRV(rpn), "p_op", 4, 0);
1405 		if(	hval &&
1406 			SvPOK(*hval) ) {
1407 			unsigned char * op = (unsigned char *)(SvPV(*hval,len));
1408 			rdfstore_triple_pattern_set_predicates_operator( tp, (	(strcmp(op,"and")==0) ||
1409 										(strcmp(op,"AND")==0) ||
1410 										(strcmp(op,"&")==0) ) ? 1 : 0 );
1411 			};
1412 		hval = hv_fetch( (HV*) SvRV(rpn), "o_op", 4, 0);
1413 		if(	hval &&
1414 			SvPOK(*hval) ) {
1415 			unsigned char * op = (unsigned char *)(SvPV(*hval,len));
1416 			rdfstore_triple_pattern_set_objects_operator( tp, (	(strcmp(op,"and")==0) ||
1417 										(strcmp(op,"AND")==0) ||
1418 										(strcmp(op,"&")==0) ) ? 1 : 0 );
1419 			};
1420 		hval = hv_fetch( (HV*) SvRV(rpn), "c_op", 4, 0);
1421 		if(	hval &&
1422 			SvPOK(*hval) ) {
1423 			unsigned char * op = (unsigned char *)(SvPV(*hval,len));
1424 			rdfstore_triple_pattern_set_contexts_operator( tp, (	(strcmp(op,"and")==0) ||
1425 										(strcmp(op,"AND")==0) ||
1426 										(strcmp(op,"&")==0) ) ? 1 : 0 );
1427 			};
1428 		hval = hv_fetch( (HV*) SvRV(rpn), "xml:lang_op", 11, 0);
1429 		if(	hval &&
1430 			SvPOK(*hval) ) {
1431 			unsigned char * op = (unsigned char *)(SvPV(*hval,len));
1432 			rdfstore_triple_pattern_set_langs_operator( tp, (	(strcmp(op,"and")==0) ||
1433 										(strcmp(op,"AND")==0) ||
1434 										(strcmp(op,"&")==0) ) ? 1 : 0 );
1435 			};
1436 		hval = hv_fetch( (HV*) SvRV(rpn), "rdf:datatype_op", 15, 0);
1437 		if(	hval &&
1438 			SvPOK(*hval) ) {
1439 			unsigned char * op = (unsigned char *)(SvPV(*hval,len));
1440 			rdfstore_triple_pattern_set_datatypes_operator( tp, (	(strcmp(op,"and")==0) ||
1441 										(strcmp(op,"AND")==0) ||
1442 										(strcmp(op,"&")==0) ) ? 1 : 0 );
1443 			};
1444 		hval = hv_fetch( (HV*) SvRV(rpn), "words_op", 8, 0);
1445 		if(	hval &&
1446 			SvPOK(*hval) ) {
1447 			unsigned char * op = (unsigned char *)(SvPV(*hval,len));
1448 			rdfstore_triple_pattern_set_words_operator( tp, (	(strcmp(op,"and")==0) ||
1449 										(strcmp(op,"AND")==0) ||
1450 										(strcmp(op,"&")==0) ) ? 1 : 0 );
1451 			};
1452 		hval = hv_fetch( (HV*) SvRV(rpn), "ranges_op", 9, 0);
1453 		if(	hval &&
1454 			SvPOK(*hval) ) {
1455 			unsigned char * op = (unsigned char *)(SvPV(*hval,len));
1456 			rdfstore_triple_pattern_set_ranges_operator( tp, (
1457 						( (strcmp(op,"a < b")==0) || (strcmp(op,"a lt b")==0) ) ? 1 :
1458 						( (strcmp(op,"a <= b")==0) || (strcmp(op,"a le b")==0) ) ? 2 :
1459 						( (strcmp(op,"a == b")==0) || (strcmp(op,"a eq b")==0) ) ? 3 :
1460 						( (strcmp(op,"a != b")==0) || (strcmp(op,"a ne b")==0) ) ? 4 :
1461 						( (strcmp(op,"a >= b")==0) || (strcmp(op,"a ge b")==0) ) ? 5 :
1462 						( (strcmp(op,"a > b")==0) || (strcmp(op,"a gt b")==0) ) ? 6 :
1463 						( (strcmp(op,"a < b < c")==0) || (strcmp(op,"a lt b lt c")==0) ) ? 7 :
1464 						( (strcmp(op,"a <= b < c")==0) || (strcmp(op,"a le b lt c")==0) ) ? 8 :
1465 						( (strcmp(op,"a <= b <= c")==0) || (strcmp(op,"a le b le c")==0) ) ? 9 :
1466 						( (strcmp(op,"a < b <= c")==0) || (strcmp(op,"a lt b le c")==0) ) ? 10 : 0 ));
1467 			};
1468 
1469 		/* special not used yet... */
1470 		hval = hv_fetch( (HV*) SvRV(rpn), "search_type", 11, 0);
1471 		if(	hval &&
1472 			SvIOK(*hval) ) {
1473 			search_type = ( SvIV(*hval) ) ? 1 : 0;
1474 			};
1475 
1476 		cc = rdfstore_search( mm, tp, search_type );
1477 
1478 		rdfstore_triple_pattern_free(tp);
1479 
1480 		if ( cc == NULL ) {
1481 			XSRETURN_UNDEF;
1482 			};
1483 
1484 		if ( cc != NULL ) {
1485                 	iterator = sv_newmortal();
1486                 	sv_setref_pv( iterator, "RDFStore::Iterator", (void*)cc);
1487                 	SvREADONLY_on(SvRV(iterator));
1488 
1489 			XPUSHs( iterator );
1490 
1491 			XSRETURN(1);
1492 		} else {
1493 			XSRETURN_UNDEF;
1494 			};
1495 
1496 void
1497 RDFStore_fetch_object ( me, resource, given_context=NULL )
1498 	SV*		me
1499 	SV*		resource
1500 	SV*		given_context
1501 
1502 	PREINIT :
1503 		RDFStore mm = (RDFStore)SvIV(SvRV(me));
1504 		RDFStore_RDFNode res=NULL;
1505 		RDFStore_RDFNode ctx=NULL;
1506 		RDFStore_Iterator cc;
1507 		SV * iterator;
1508 
1509 	PPCODE:
1510 		if ( ! ( ( SvROK(resource) ) &&
1511                          ( sv_isa( resource, "RDFStore::Resource") ) ) ) {
1512                         croak("fetch_object: Invalid resource\n");
1513 			XSRETURN_UNDEF;
1514                         };
1515 
1516 		if (    ( given_context != NULL ) &&
1517                         ( given_context != &PL_sv_undef ) &&
1518                         ( SvTRUE(given_context) ) ) {
1519                         if ( ! ( ( SvROK(given_context) ) &&
1520                                  ( sv_isa( given_context, "RDFStore::Resource") ) ) ) {
1521 				croak("fetch_object: Invalid context\n");
1522 				XSRETURN_UNDEF;
1523                                 };
1524 
1525                 	ctx = (RDFStore_RDFNode)SvIV(SvRV(given_context));
1526                         };
1527 
1528                 res = (RDFStore_RDFNode)SvIV(SvRV(resource));
1529 
1530 		cc = rdfstore_fetch_object( mm, res, ctx );
1531 
1532 		if ( cc == NULL ) {
1533 			XSRETURN_UNDEF;
1534 			};
1535 
1536 		if ( cc != NULL ) {
1537                 	iterator = sv_newmortal();
1538                 	sv_setref_pv( iterator, "RDFStore::Iterator", (void*)cc);
1539                 	SvREADONLY_on(SvRV(iterator));
1540 
1541 			XPUSHs( iterator );
1542 
1543 			XSRETURN(1);
1544 		} else {
1545 			XSRETURN_UNDEF;
1546 			};
1547 
1548 MODULE = RDFStore	PACKAGE = RDFStore::Iterator	PREFIX = RDFStore_Iterator_
1549 
1550 PROTOTYPES: DISABLE
1551 
1552 void
1553 RDFStore_Iterator_new ( package, store )
1554 	SV*		package
1555         RDFStore 	store
1556 
1557 	PREINIT:
1558 		RDFStore_Iterator context;
1559 		SV * iterator;
1560 		store = NULL;
1561 
1562 	PPCODE:
1563 		if (!SvROK(package)) {
1564 			/* bless() the store cursor */
1565             		STRLEN my_na;
1566             		char *sclass = SvPV(package, my_na);
1567 			context = rdfstore_elements( store );
1568 
1569             		iterator = sv_newmortal();
1570             		sv_setref_pv( iterator, sclass, (void*)context);
1571             		SvREADONLY_on(SvRV(iterator));
1572 
1573 			XPUSHs( iterator );
1574         	} else {
1575 			/* just get through */
1576             		context = (RDFStore_Iterator)SvIV(SvRV(package));
1577         		};
1578 
1579         	XSRETURN(1);
1580 
1581 unsigned int
1582 RDFStore_Iterator_size ( me )
1583 	SV*             me
1584 
1585         PREINIT:
1586                 RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1587         CODE:
1588 
1589                 RETVAL = rdfstore_iterator_size ( context );
1590 
1591         OUTPUT:
1592                 RETVAL
1593 
1594 int
1595 RDFStore_Iterator_hasnext ( me )
1596 	SV*		me
1597 
1598 	PREINIT:
1599 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1600 
1601 	CODE:
1602 
1603 		RETVAL = rdfstore_iterator_hasnext ( context );
1604 
1605 	OUTPUT:
1606 		RETVAL
1607 
1608 void
1609 RDFStore_Iterator_next ( me )
1610 	SV*		me
1611 
1612 	PREINIT:
1613         	RDFStore_Statement ss;
1614 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1615 		SV * statement;
1616 
1617 	PPCODE:
1618 		ss = rdfstore_iterator_next ( context );
1619 
1620                 if ( ss != NULL )  {
1621 			/* bless() the statement */
1622                         statement = sv_newmortal();
1623                         sv_setref_pv( statement, "RDFStore::Statement", (void*)ss);
1624                         SvREADONLY_on(SvRV(statement));
1625 
1626 			XPUSHs( statement );
1627 
1628 			XSRETURN(1);
1629 		} else {
1630 			XSRETURN_UNDEF;
1631 			};
1632 
1633 void
1634 RDFStore_Iterator_next_subject ( me )
1635 	SV*		me
1636 
1637 	PREINIT:
1638         	RDFStore_RDFNode resource;
1639 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1640 		SV * node;
1641 
1642 	PPCODE:
1643 		resource = rdfstore_iterator_next_subject ( context );
1644 
1645                 if ( resource != NULL )  {
1646 			/* bless() the node */
1647                         node = sv_newmortal();
1648                         sv_setref_pv( node, "RDFStore::Resource", (void*)resource);
1649                         SvREADONLY_on(SvRV(node));
1650 
1651 			XPUSHs( node );
1652 
1653 			XSRETURN(1);
1654 		} else {
1655 			XSRETURN_UNDEF;
1656 			};
1657 
1658 void
1659 RDFStore_Iterator_next_predicate ( me )
1660 	SV*		me
1661 
1662 	PREINIT:
1663         	RDFStore_RDFNode resource;
1664 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1665 		SV * node;
1666 
1667 	PPCODE:
1668 		resource = rdfstore_iterator_next_predicate ( context );
1669 
1670 		if ( resource != NULL )  {
1671                         node = sv_newmortal();
1672                         sv_setref_pv( node, "RDFStore::Resource", (void*)resource);
1673                         SvREADONLY_on(SvRV(node));
1674 
1675 			XPUSHs( node );
1676 
1677 			XSRETURN(1);
1678                 } else {
1679 			XSRETURN_UNDEF;
1680                         };
1681 
1682 void
1683 RDFStore_Iterator_next_object ( me )
1684 	SV*		me
1685 
1686 	PREINIT:
1687         	RDFStore_RDFNode object;
1688 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1689 		SV * node;
1690 
1691 	PPCODE:
1692 		object = rdfstore_iterator_next_object ( context );
1693 
1694 		if ( object != NULL )  {
1695                         node = sv_newmortal();
1696                         sv_setref_pv( node, ( rdfstore_node_get_type( object ) != RDFSTORE_NODE_TYPE_LITERAL ) ? "RDFStore::Resource" : "RDFStore::Literal", (void*)object);
1697                         SvREADONLY_on(SvRV(node));
1698 
1699 			XPUSHs( node );
1700 
1701                         XSRETURN(1);
1702                 } else {
1703 			XSRETURN_UNDEF;
1704                         };
1705 
1706 void
1707 RDFStore_Iterator_next_context ( me )
1708 	SV*		me
1709 
1710 	PREINIT:
1711         	RDFStore_RDFNode resource;
1712 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1713 		SV * node;
1714 
1715 	PPCODE:
1716 		resource = rdfstore_iterator_next_context ( context );
1717 
1718 		if ( resource != NULL )  {
1719                         node = sv_newmortal();
1720                         sv_setref_pv( node, "RDFStore::Resource", (void*)resource);
1721                         SvREADONLY_on(SvRV(node));
1722 
1723 			XPUSHs( node );
1724 
1725 			XSRETURN(1);
1726                 } else {
1727 			XSRETURN_UNDEF;
1728                         };
1729 
1730 void
1731 RDFStore_Iterator_current ( me )
1732 	SV*		me
1733 
1734 	PREINIT:
1735         	RDFStore_Statement ss;
1736 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1737 		SV * statement;
1738 
1739 	PPCODE:
1740 		ss = rdfstore_iterator_current ( context );
1741 
1742 		if ( ss != NULL )  {
1743 			/* bless() the statement */
1744                         statement = sv_newmortal();
1745                         sv_setref_pv( statement, "RDFStore::Statement", (void*)ss);
1746                         SvREADONLY_on(SvRV(statement));
1747 
1748 			XPUSHs( statement );
1749 
1750 			XSRETURN(1);
1751                 } else {
1752 			XSRETURN_UNDEF;
1753                         };
1754 
1755 void
1756 RDFStore_Iterator_current_subject ( me )
1757 	SV*		me
1758 
1759 	PREINIT:
1760         	RDFStore_RDFNode resource;
1761 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1762 		SV * node;
1763 
1764 	PPCODE:
1765 		resource = rdfstore_iterator_current_subject ( context );
1766 
1767 		if ( resource != NULL )  {
1768                         node = sv_newmortal();
1769                         sv_setref_pv( node, "RDFStore::Resource", (void*)resource);
1770                         SvREADONLY_on(SvRV(node));
1771 
1772 			XPUSHs( node );
1773 
1774 			XSRETURN(1);
1775                 } else {
1776 			XSRETURN_UNDEF;
1777                         };
1778 
1779 void
1780 RDFStore_Iterator_current_predicate ( me )
1781 	SV*		me
1782 
1783 	PREINIT:
1784         	RDFStore_RDFNode resource;
1785 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1786 		SV * node;
1787 
1788 	PPCODE:
1789 		resource = rdfstore_iterator_current_predicate ( context );
1790 
1791 		if ( resource != NULL )  {
1792                         node = sv_newmortal();
1793                         sv_setref_pv( node, "RDFStore::Resource", (void*)resource);
1794                         SvREADONLY_on(SvRV(node));
1795 
1796 			XPUSHs( node );
1797 
1798 			XSRETURN(1);
1799                 } else {
1800 			XSRETURN_UNDEF;
1801                         };
1802 
1803 void
1804 RDFStore_Iterator_current_object ( me )
1805 	SV*		me
1806 
1807 	PREINIT:
1808         	RDFStore_RDFNode object;
1809 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1810 		SV * node;
1811 
1812 	PPCODE:
1813 		object = rdfstore_iterator_current_object ( context );
1814 
1815                 if ( object != NULL )  {
1816                         node = sv_newmortal();
1817                         sv_setref_pv( node, ( rdfstore_node_get_type( object ) != RDFSTORE_NODE_TYPE_LITERAL ) ? "RDFStore::Resource" : "RDFStore::Literal", (void*)object);
1818                         SvREADONLY_on(SvRV(node));
1819 
1820 			XPUSHs( node );
1821 
1822 			XSRETURN(1);
1823                 } else {
1824 			XSRETURN_UNDEF;
1825                         };
1826 
1827 void
1828 RDFStore_Iterator_current_context ( me )
1829 	SV*		me
1830 
1831 	PREINIT:
1832         	RDFStore_RDFNode resource;
1833 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1834 		SV * node;
1835 
1836 	PPCODE:
1837 		resource = rdfstore_iterator_current_context ( context );
1838 
1839 		if ( resource != NULL )  {
1840                         node = sv_newmortal();
1841                         sv_setref_pv( node, "RDFStore::Resource", (void*)resource);
1842                         SvREADONLY_on(SvRV(node));
1843 
1844 			XPUSHs( node );
1845 
1846 			XSRETURN(1);
1847                 } else {
1848 			XSRETURN_UNDEF;
1849                         };
1850 
1851 void
1852 RDFStore_Iterator_first ( me )
1853 	SV*		me
1854 
1855 	PREINIT:
1856         	RDFStore_Statement ss;
1857 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1858 		SV * statement;
1859 
1860 	PPCODE:
1861 		ss = rdfstore_iterator_first ( context );
1862 
1863 		if ( ss != NULL )  {
1864 			/* bless() the statement */
1865                         statement = sv_newmortal();
1866                         sv_setref_pv( statement, "RDFStore::Statement", (void*)ss);
1867                         SvREADONLY_on(SvRV(statement));
1868 
1869 			XPUSHs( statement );
1870 
1871 			XSRETURN(1);
1872                 } else {
1873 			XSRETURN_UNDEF;
1874                         };
1875 
1876 void
1877 RDFStore_Iterator_first_subject ( me )
1878 	SV*		me
1879 
1880 	PREINIT:
1881         	RDFStore_RDFNode resource;
1882 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1883 		SV * node;
1884 
1885 	PPCODE:
1886 		resource = rdfstore_iterator_first_subject ( context );
1887 
1888 		if ( resource != NULL )  {
1889                         node = sv_newmortal();
1890                         sv_setref_pv( node, "RDFStore::Resource", (void*)resource);
1891                         SvREADONLY_on(SvRV(node));
1892 
1893 			XPUSHs( node );
1894 
1895 			XSRETURN(1);
1896                 } else {
1897 			XSRETURN_UNDEF;
1898                         };
1899 
1900 void
1901 RDFStore_Iterator_first_predicate ( me )
1902 	SV*		me
1903 
1904 	PREINIT:
1905         	RDFStore_RDFNode resource;
1906 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1907 		SV * node;
1908 
1909 	PPCODE:
1910 		resource = rdfstore_iterator_first_predicate ( context );
1911 
1912 		if ( resource != NULL )  {
1913                         node = sv_newmortal();
1914                         sv_setref_pv( node, "RDFStore::Resource", (void*)resource);
1915                         SvREADONLY_on(SvRV(node));
1916 
1917 			XPUSHs( node );
1918 
1919 			XSRETURN(1);
1920                 } else {
1921 			XSRETURN_UNDEF;
1922                         };
1923 
1924 void
1925 RDFStore_Iterator_first_object ( me )
1926 	SV*		me
1927 
1928 	PREINIT:
1929         	RDFStore_RDFNode object;
1930 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1931 		SV * node;
1932 
1933 	PPCODE:
1934 		object = rdfstore_iterator_first_object ( context );
1935 
1936                 if ( object != NULL )  {
1937                         node = sv_newmortal();
1938                         sv_setref_pv( node, ( rdfstore_node_get_type( object ) != RDFSTORE_NODE_TYPE_LITERAL ) ? "RDFStore::Resource" : "RDFStore::Literal", (void*)object);
1939                         SvREADONLY_on(SvRV(node));
1940 
1941 			XPUSHs( node );
1942 
1943 			XSRETURN(1);
1944                 } else {
1945 			XSRETURN_UNDEF;
1946                         };
1947 
1948 void
1949 RDFStore_Iterator_first_context ( me )
1950 	SV*		me
1951 
1952 	PREINIT:
1953         	RDFStore_RDFNode resource;
1954 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1955 		SV * node;
1956 
1957 	PPCODE:
1958 		resource = rdfstore_iterator_first_context ( context );
1959 
1960 		if ( resource != NULL )  {
1961                         node = sv_newmortal();
1962                         sv_setref_pv( node, "RDFStore::Resource", (void*)resource);
1963                         SvREADONLY_on(SvRV(node));
1964 
1965 			XPUSHs( node );
1966 
1967 			XSRETURN(1);
1968                 } else {
1969 			XSRETURN_UNDEF;
1970                         };
1971 
1972 void
1973 RDFStore_Iterator_each ( me )
1974 	SV*		me
1975 
1976 	PREINIT:
1977         	RDFStore_Statement ss;
1978 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
1979 		SV * statement;
1980 
1981 	PPCODE:
1982 		ss = rdfstore_iterator_each ( context );
1983 
1984 		if ( ss != NULL )  {
1985 			/* bless() the statement */
1986                         statement = sv_newmortal();
1987                         sv_setref_pv( statement, "RDFStore::Statement", (void*)ss);
1988                         SvREADONLY_on(SvRV(statement));
1989 
1990 			XPUSHs( statement );
1991 
1992 			XSRETURN(1);
1993                 } else {
1994 			XSRETURN_UNDEF;
1995                         };
1996 
1997 void
1998 RDFStore_Iterator_each_subject ( me )
1999 	SV*		me
2000 
2001 	PREINIT:
2002         	RDFStore_RDFNode resource;
2003 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
2004 		SV * node;
2005 
2006 	PPCODE:
2007 		resource = rdfstore_iterator_each_subject ( context );
2008 
2009 		if ( resource != NULL )  {
2010                         node = sv_newmortal();
2011                         sv_setref_pv( node, "RDFStore::Resource", (void*)resource);
2012                         SvREADONLY_on(SvRV(node));
2013 
2014 			XPUSHs( node );
2015 
2016 			XSRETURN(1);
2017                 } else {
2018 			XSRETURN_UNDEF;
2019                         };
2020 
2021 void
2022 RDFStore_Iterator_each_predicate ( me )
2023 	SV*		me
2024 
2025 	PREINIT:
2026         	RDFStore_RDFNode resource;
2027 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
2028 		SV * node;
2029 
2030 	PPCODE:
2031 		resource = rdfstore_iterator_each_predicate ( context );
2032 
2033 		if ( resource != NULL )  {
2034                         node = sv_newmortal();
2035                         sv_setref_pv( node, "RDFStore::Resource", (void*)resource);
2036                         SvREADONLY_on(SvRV(node));
2037 
2038 			XPUSHs( node );
2039 
2040 			XSRETURN(1);
2041                 } else {
2042 			XSRETURN_UNDEF;
2043                         };
2044 
2045 void
2046 RDFStore_Iterator_each_object ( me )
2047 	SV*		me
2048 
2049 	PREINIT:
2050         	RDFStore_RDFNode object;
2051 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
2052 		SV * node;
2053 
2054 	PPCODE:
2055 		object = rdfstore_iterator_each_object ( context );
2056 
2057                 if ( object != NULL )  {
2058                         node = sv_newmortal();
2059                         sv_setref_pv( node, ( rdfstore_node_get_type( object ) != RDFSTORE_NODE_TYPE_LITERAL ) ? "RDFStore::Resource" : "RDFStore::Literal", (void*)object);
2060                         SvREADONLY_on(SvRV(node));
2061 
2062 			XPUSHs( node );
2063 
2064 			XSRETURN(1);
2065                 } else {
2066 			XSRETURN_UNDEF;
2067                         };
2068 
2069 void
2070 RDFStore_Iterator_each_context ( me )
2071 	SV*		me
2072 
2073 	PREINIT:
2074         	RDFStore_RDFNode resource;
2075 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
2076 		SV * node;
2077 
2078 	PPCODE:
2079 		resource = rdfstore_iterator_each_context ( context );
2080 
2081 		if ( resource != NULL )  {
2082                         node = sv_newmortal();
2083                         sv_setref_pv( node, "RDFStore::Resource", (void*)resource);
2084                         SvREADONLY_on(SvRV(node));
2085 
2086 			XPUSHs( node );
2087 
2088 			XSRETURN(1);
2089                 } else {
2090 			XSRETURN_UNDEF;
2091                         };
2092 
2093 int
2094 RDFStore_Iterator_remove ( me )
2095         SV*             me
2096 
2097         PREINIT:
2098                 RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
2099 
2100         CODE:
2101 
2102                 RETVAL = rdfstore_iterator_remove ( context );
2103 
2104         OUTPUT:
2105                 RETVAL
2106 
2107 int
2108 RDFStore_Iterator_contains ( me, subject, predicate=NULL, object=NULL, cc=NULL )
2109         SV*             me
2110         SV*             subject
2111         SV*             predicate
2112         SV*             object
2113         SV*             cc
2114 
2115         PREINIT:
2116                 RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
2117                 RDF_Statement *	statement;
2118 
2119         CODE:
2120 		if ( !  ( ( subject != NULL ) &&
2121                           ( subject != &PL_sv_undef ) &&
2122                           ( SvTRUE(subject) ) &&
2123                           ( SvROK(subject) ) &&
2124                           (     ( sv_isa( subject, "RDFStore::Resource") ) ||
2125                                 ( sv_isa( subject, "RDFStore::Statement") ) ) ) ) {
2126                         croak("iterator_contains: Invalid subject or statement\n");
2127                         XSRETURN_UNDEF;
2128                         };
2129 		if (    ( predicate != NULL ) &&
2130                         ( predicate != &PL_sv_undef ) &&
2131 			( SvTRUE(predicate) ) ) {
2132                         if ( ! ( ( SvROK(predicate) ) &&
2133                                  ( sv_isa( predicate, "RDFStore::Resource") ) ) ) {
2134                                 croak("search: Invalid predicate\n");
2135 				XSRETURN_UNDEF;
2136                                 };
2137                         };
2138                 if (    ( object != NULL ) &&
2139                         ( object != &PL_sv_undef ) &&
2140 			( SvTRUE(object) ) ) {
2141                         if ( ! ( ( SvROK(object) ) &&
2142                                  (      ( sv_isa( object, "RDFStore::Literal") ) ||
2143                                         ( sv_isa( object, "RDFStore::Resource") ) ) ) ) {
2144                                 croak("search: Invalid object\n");
2145 				XSRETURN_UNDEF;
2146                                 };
2147                         };
2148                 if (    ( cc != NULL ) &&
2149                         ( cc != &PL_sv_undef ) &&
2150 			( SvTRUE(cc) ) ) {
2151                         if ( ! ( ( SvROK(cc) ) &&
2152                                  ( sv_isa( cc, "RDFStore::Resource") ) ) ) {
2153                                 croak("search: Invalid statement context\n");
2154 				XSRETURN_UNDEF;
2155                                 };
2156                         };
2157 
2158                 /* create a temporary statement */
2159 		if ( ! sv_isa( ST(1), "RDFStore::Statement") ) {
2160 			statement = new_Statement_Object( subject, predicate, object, NULL, 0, NULL );
2161                         if ( statement == NULL ) {
2162                                 XSRETURN_UNDEF;
2163                                 };
2164                 } else {
2165                         statement = ((RDFStore_Statement)SvIV(SvRV(ST(1))));
2166                         };
2167 
2168 		RETVAL=rdfstore_iterator_contains( context, statement, ( ( cc != NULL ) && ( cc != &PL_sv_undef ) && ( SvROK( cc ) ) ) ? (RDFStore_RDFNode)SvIV(SvRV(cc)) : NULL );
2169 
2170                 if ( ! sv_isa( ST(1), "RDFStore::Statement") ) {
2171 			rdfstore_statement_free( statement );
2172                         };
2173         OUTPUT:
2174                 RETVAL
2175 
2176 void
2177 RDFStore_Iterator_duplicate ( me )
2178 	SV*             me
2179 
2180         PREINIT:
2181                 RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
2182                 RDFStore_Iterator duplicate;
2183 		SV * iterator;
2184 
2185 	PPCODE:
2186                 duplicate = rdfstore_iterator_duplicate ( context );
2187 
2188 		if ( duplicate != NULL ) {
2189                 	iterator = sv_newmortal();
2190                 	sv_setref_pv( iterator, "RDFStore::Iterator", (void*)duplicate);
2191                 	SvREADONLY_on(SvRV(iterator));
2192 
2193 			XPUSHs( iterator );
2194 
2195 			XSRETURN(1);
2196 		} else {
2197 			XSRETURN_UNDEF;
2198 			};
2199 
2200 void
2201 RDFStore_Iterator_intersect ( me, you )
2202 	SV*             me
2203 	SV*             you
2204 
2205         PREINIT:
2206                 RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
2207                 RDFStore_Iterator context1 = (RDFStore_Iterator)SvIV(SvRV(you));
2208                 RDFStore_Iterator cc;
2209 		SV * iterator;
2210 
2211 	PPCODE:
2212                 cc = rdfstore_iterator_intersect ( context, context1 );
2213 		if ( cc != NULL ) {
2214                 	iterator = sv_newmortal();
2215                 	sv_setref_pv( iterator, "RDFStore::Iterator", (void*)cc);
2216                 	SvREADONLY_on(SvRV(iterator));
2217 
2218 			XPUSHs( iterator );
2219 
2220 			XSRETURN(1);
2221 		} else {
2222 			XSRETURN_UNDEF;
2223 			};
2224 
2225 void
2226 RDFStore_Iterator_unite ( me, you )
2227 	SV*             me
2228 	SV*             you
2229 
2230         PREINIT:
2231                 RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
2232                 RDFStore_Iterator context1 = (RDFStore_Iterator)SvIV(SvRV(you));
2233                 RDFStore_Iterator cc;
2234 		SV * iterator;
2235 
2236 	PPCODE:
2237                 cc = rdfstore_iterator_unite ( context, context1 );
2238 		if ( cc != NULL ) {
2239                 	iterator = sv_newmortal();
2240                 	sv_setref_pv( iterator, "RDFStore::Iterator", (void*)cc);
2241                 	SvREADONLY_on(SvRV(iterator));
2242 
2243 			XPUSHs( iterator );
2244 
2245 			XSRETURN(1);
2246 		} else {
2247 			XSRETURN_UNDEF;
2248 			};
2249 
2250 void
2251 RDFStore_Iterator_subtract ( me, you )
2252 	SV*             me
2253 	SV*             you
2254 
2255         PREINIT:
2256                 RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
2257                 RDFStore_Iterator context1 = (RDFStore_Iterator)SvIV(SvRV(you));
2258                 RDFStore_Iterator cc;
2259 		SV * iterator;
2260 
2261 	PPCODE:
2262                 cc = rdfstore_iterator_subtract ( context, context1 );
2263 		if ( cc != NULL ) {
2264                 	iterator = sv_newmortal();
2265                 	sv_setref_pv( iterator, "RDFStore::Iterator", (void*)cc);
2266                 	SvREADONLY_on(SvRV(iterator));
2267 
2268 			XPUSHs( iterator );
2269 
2270 			XSRETURN(1);
2271 		} else {
2272 			XSRETURN_UNDEF;
2273 			};
2274 
2275 void
2276 RDFStore_Iterator_complement ( me )
2277 	SV*             me
2278 
2279         PREINIT:
2280                 RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
2281                 RDFStore_Iterator cc;
2282 		SV * iterator;
2283 
2284 	PPCODE:
2285                 cc = rdfstore_iterator_complement ( context );
2286 		if ( cc != NULL ) {
2287                 	iterator = sv_newmortal();
2288                 	sv_setref_pv( iterator, "RDFStore::Iterator", (void*)cc);
2289                 	SvREADONLY_on(SvRV(iterator));
2290 
2291 			XPUSHs( iterator );
2292 
2293 			XSRETURN(1);
2294 		} else {
2295 			XSRETURN_UNDEF;
2296 			};
2297 
2298 void
2299 RDFStore_Iterator_exor ( me, you )
2300 	SV*             me
2301 	SV*             you
2302 
2303         PREINIT:
2304                 RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
2305                 RDFStore_Iterator context1 = (RDFStore_Iterator)SvIV(SvRV(you));
2306                 RDFStore_Iterator cc;
2307 		SV * iterator;
2308 
2309 	CODE:
2310                 cc = rdfstore_iterator_exor ( context, context1 );
2311 		if ( cc != NULL ) {
2312                 	iterator = sv_newmortal();
2313                 	sv_setref_pv( iterator, "RDFStore::Iterator", (void*)cc);
2314                 	SvREADONLY_on(SvRV(iterator));
2315 
2316 			XPUSHs( iterator );
2317 
2318 			XSRETURN(1);
2319 		} else {
2320 			XSRETURN_UNDEF;
2321 			};
2322 
2323 void
2324 RDFStore_Iterator_DESTROY(me)
2325 	SV*		me
2326 
2327 	PREINIT:
2328 		RDFStore_Iterator context = (RDFStore_Iterator)SvIV(SvRV(me));
2329 
2330         CODE:
2331 		rdfstore_iterator_close( context );
2332 
2333 MODULE = RDFStore       PACKAGE = RDFStore::Util::UTF8  PREFIX = RDFStore_Util_UTF8_
2334 
2335 PROTOTYPES: DISABLE
2336 
2337 void
2338 RDFStore_Util_UTF8_cp_to_utf8 ( cp )
2339         unsigned long cp
2340 
2341         PREINIT:
2342 		unsigned int utf8_size=0;
2343 		unsigned char utf8_buff[RDFSTORE_UTF8_MAXLEN+1]; /* one utf8 char */
2344                 bzero(utf8_buff,RDFSTORE_UTF8_MAXLEN);
2345 
2346         PPCODE:
2347 		if ( rdfstore_utf8_cp_to_utf8( cp, &utf8_size, utf8_buff ) ) {
2348 			XSRETURN_UNDEF;
2349 			};
2350 
2351 		memcpy(utf8_buff+utf8_size,"\0",1);
2352 
2353         	ST(0) = sv_2mortal( newSVpv( utf8_buff, utf8_size ) );
2354 
2355 		XSRETURN(1);
2356 
2357 void
2358 RDFStore_Util_UTF8_utf8_to_cp ( utf8_buff )
2359         unsigned char * utf8_buff
2360 
2361         PREINIT:
2362 		unsigned long cp=0;
2363 		unsigned int utf8_size=0;
2364 
2365         PPCODE:
2366 
2367         	if ( utf8_buff == NULL )
2368 			XSRETURN_UNDEF;
2369 
2370 		if ( ( rdfstore_utf8_is_utf8( utf8_buff, &utf8_size ) ) && ( utf8_size > 1 ) ) {
2371 			if ( rdfstore_utf8_utf8_to_cp( utf8_size, utf8_buff, &cp ) ) {
2372 				XSRETURN_UNDEF;
2373 				};
2374                 } else {
2375 			XSRETURN_UNDEF;
2376                         };
2377 
2378         	ST(0) = sv_2mortal( newSViv( cp ) );
2379 
2380 		XSRETURN(1);
2381 
2382 int
2383 RDFStore_Util_UTF8_is_utf8 ( utf8_buff )
2384         unsigned char * utf8_buff
2385 
2386         PREINIT:
2387 		unsigned int utf8_size=0;
2388 
2389         CODE:
2390         	if ( utf8_buff == NULL )
2391 			XSRETURN_UNDEF;
2392 		if ( rdfstore_utf8_is_utf8( utf8_buff, &utf8_size ) ) {
2393 			RETVAL = utf8_size;
2394 		} else {
2395 			RETVAL = 0;
2396 			};
2397 
2398 	OUTPUT:
2399 		RETVAL
2400 
2401 void
2402 RDFStore_Util_UTF8_to_utf8 ( string )
2403         unsigned char * string
2404 
2405         PREINIT:
2406 		unsigned int utf8_size=0;
2407 		unsigned char utf8_buff[RDFSTORE_UTF8_MAXLEN+1]; /* one utf8 char */
2408                 bzero(utf8_buff,RDFSTORE_UTF8_MAXLEN);
2409 
2410         PPCODE:
2411 
2412         	if ( string == NULL )
2413 			XSRETURN_UNDEF;
2414 
2415 		if ( rdfstore_utf8_string_to_utf8( strlen(string), string, &utf8_size, utf8_buff ) ) {
2416 			XSRETURN_UNDEF;
2417                         };
2418 
2419 		memcpy(utf8_buff+utf8_size,"\0",1);
2420 
2421         	ST(0) = sv_2mortal( newSVpv( utf8_buff, utf8_size ) );
2422 
2423 		XSRETURN(1);
2424 
2425 void
2426 RDFStore_Util_UTF8_to_utf8_foldedcase ( string )
2427         unsigned char * string
2428 
2429         PREINIT:
2430 		unsigned int utf8_size=0;
2431 		unsigned char utf8_casefolded_buff[RDFSTORE_UTF8_MAXLEN_FOLD+1]; /* one case-folded utf8 char */
2432                 bzero(utf8_casefolded_buff,RDFSTORE_UTF8_MAXLEN_FOLD);
2433 
2434         PPCODE:
2435 
2436         	if ( string == NULL )
2437 			XSRETURN_UNDEF;
2438 
2439 		if ( rdfstore_utf8_string_to_utf8_foldedcase( strlen(string), string, &utf8_size, utf8_casefolded_buff ) ) {
2440 			XSRETURN_UNDEF;
2441                         };
2442 
2443 		memcpy(utf8_casefolded_buff+utf8_size,"\0",1);
2444 
2445         	ST(0) = sv_2mortal( newSVpv( utf8_casefolded_buff, utf8_size ) );
2446 
2447 		XSRETURN(1);
2448 
2449 MODULE = RDFStore       PACKAGE = RDFStore::Util::Digest  PREFIX = RDFStore_Util_Digest_
2450 
2451 PROTOTYPES: DISABLE
2452 
2453 void
2454 RDFStore_Util_Digest_computeDigest ( input )
2455         unsigned char *   input
2456 
2457         PREINIT:
2458                 unsigned char dd[RDFSTORE_SHA_DIGESTSIZE];
2459 
2460         PPCODE:
2461 
2462         	if (! SvPOK(ST(0)) )
2463 			XSRETURN_UNDEF;
2464         	rdfstore_digest_digest(input, strlen(input), dd);
2465 
2466         	ST(0) = sv_2mortal( newSVpv( dd, RDFSTORE_SHA_DIGESTSIZE ) );
2467 
2468 		XSRETURN(1);
2469 
2470 char *
2471 RDFStore_Util_Digest_getDigestAlgorithm ()
2472 
2473         CODE:
2474 
2475         RETVAL = (char *) rdfstore_digest_get_digest_algorithm();
2476 
2477         OUTPUT:
2478 
2479         RETVAL
2480 
2481 MODULE = RDFStore       PACKAGE = DBMS
2482 
2483 PROTOTYPES: DISABLE
2484 
2485 DBMS
2486 TIEHASH(class,name,mode=DBMS_MODE,bt_compare_fcn_type=0,host=DBMS_HOST,port=DBMS_PORT)
2487 	char * 		class
2488 	char *		name
2489 	dbms_xsmode_t	mode
2490 	char *		host
2491 	int		port
2492 	int		bt_compare_fcn_type
2493 
2494 	PREINIT:
2495 	dbms * me;
2496 
2497 	CODE:
2498 	class = class;
2499 
2500 	me = dbms_connect(name,host,port,mode,&safemalloc,&safefree,NULL,&set_dbms_error, bt_compare_fcn_type);
2501 	if (me==NULL)
2502 		XSRETURN_UNDEF;
2503 
2504 	RETVAL=me;
2505 
2506 	OUTPUT:
2507 
2508 	RETVAL
2509 
2510 void
2511 DESTROY(me)
2512 	DBMS	me
2513 
2514 	CODE:
2515 
2516 	/* disconect, close any sockets and free me memory. */
2517 	dbms_disconnect(me);
2518 
2519 DBT
2520 FETCH(me, key)
2521 	DBMS 		me
2522 	DBT		key
2523 
2524 	PREINIT:
2525 	int retval;
2526 	CODE:
2527 
2528 
2529 	RETVAL.data = NULL; RETVAL.size = 0;
2530 
2531 	if(dbms_comms(me, TOKEN_FETCH, &retval, &key, NULL,NULL,&RETVAL))
2532                 XSRETURN_UNDEF;
2533 
2534 	if (retval == 1)
2535 		XSRETURN_UNDEF;
2536 
2537 	OUTPUT:
2538 
2539 	RETVAL
2540 
2541 DBT
2542 INC(me, key)
2543         DBMS           	me
2544         DBT            	key
2545 
2546         PREINIT:
2547         int retval;
2548 
2549         CODE:
2550         if (dbms_comms(me, TOKEN_INC, &retval, &key, NULL, NULL, &RETVAL))
2551                 XSRETURN_UNDEF;
2552 
2553 	if (retval == 1)
2554 		XSRETURN_UNDEF;
2555 
2556 	OUTPUT:
2557 
2558 	RETVAL
2559 
2560 DBT
2561 DEC(me, key)
2562         DBMS           	me
2563         DBT            	key
2564 
2565         PREINIT:
2566         int retval;
2567 
2568         CODE:
2569         if (dbms_comms(me, TOKEN_DEC, &retval, &key, NULL, NULL, &RETVAL))
2570                 XSRETURN_UNDEF;
2571 
2572 	if (retval == 1)
2573 		XSRETURN_UNDEF;
2574 
2575 	OUTPUT:
2576 
2577         RETVAL
2578 
2579 int
2580 STORE(me, key, value)
2581 	DBMS		me
2582 	DBT		key
2583 	DBT		value
2584 
2585         PREINIT:
2586 	int retval;
2587 
2588         CODE:
2589 	if (dbms_comms(me, TOKEN_STORE, &retval, &key, &value, NULL, NULL))
2590                 XSRETURN_UNDEF;
2591 
2592         RETVAL = (retval == 0) ? 1 : 0;
2593 
2594 	OUTPUT:
2595 
2596         RETVAL
2597 
2598 int
2599 DELETE(me, key)
2600 	DBMS	me
2601 	DBT	key
2602         PREINIT:
2603 	int retval;
2604 
2605         CODE:
2606 
2607         if(dbms_comms(me, TOKEN_DELETE, &retval, &key, NULL, NULL, NULL))
2608                 XSRETURN_UNDEF;
2609 
2610         RETVAL = (retval == 0) ? 1 : 0;
2611 
2612 	OUTPUT:
2613 
2614         RETVAL
2615 
2616 DBT
2617 FROM(me, key)
2618 	DBMS	me
2619 	DBT		key
2620 
2621         PREINIT:
2622 	int retval;
2623 
2624         CODE:
2625 	RETVAL.data = NULL; RETVAL.size = 0;
2626         if(dbms_comms(me, TOKEN_FROM, &retval, &key, NULL, &RETVAL, NULL))
2627                 XSRETURN_UNDEF;
2628 
2629 	if (retval == 1)
2630 		XSRETURN_UNDEF;
2631 
2632 	OUTPUT:
2633 
2634         RETVAL
2635 
2636 DBT
2637 FIRSTKEY(me)
2638 	DBMS	me
2639 
2640         PREINIT:
2641 	int retval;
2642 
2643         CODE:
2644 	RETVAL.data = NULL; RETVAL.size = 0;
2645         if(dbms_comms(me, TOKEN_FIRSTKEY, &retval, NULL, NULL, &RETVAL, NULL))
2646                 XSRETURN_UNDEF;
2647 
2648 	if (retval == 1)
2649 		XSRETURN_UNDEF;
2650 
2651 	OUTPUT:
2652 
2653         RETVAL
2654 
2655 DBT
2656 NEXTKEY(me, key)
2657 	DBMS	me
2658 	DBT		key
2659 
2660        	PREINIT:
2661 	int retval;
2662 
2663         CODE:
2664 	RETVAL.data = NULL; RETVAL.size = 0;
2665 
2666         if (dbms_comms(me, TOKEN_NEXTKEY, &retval, &key, NULL, &RETVAL, NULL))
2667 		XSRETURN_UNDEF;
2668 
2669 	if (retval == 1)
2670 		XSRETURN_UNDEF;
2671 
2672 	OUTPUT:
2673 
2674         RETVAL
2675 
2676 DBT
2677 PING(me)
2678 	DBMS	me
2679 
2680        	PREINIT:
2681 	int retval;
2682 
2683         CODE:
2684 	RETVAL.data = NULL; RETVAL.size = 0;
2685 
2686         if (dbms_comms(me, TOKEN_PING, &retval, NULL, NULL, &RETVAL, NULL))
2687 		XSRETURN_UNDEF;
2688 
2689 	if (retval == 1)
2690 		XSRETURN_UNDEF;
2691 
2692 	OUTPUT:
2693 
2694         RETVAL
2695 
2696 DBT
2697 DROP(me)
2698 	DBMS	me
2699 
2700        	PREINIT:
2701 	int retval;
2702 
2703         CODE:
2704 	RETVAL.data = NULL; RETVAL.size = 0;
2705 
2706         if (dbms_comms(me, TOKEN_DROP, &retval, NULL, NULL, &RETVAL, NULL))
2707 		XSRETURN_UNDEF;
2708 
2709 	if (retval == 1)
2710 		XSRETURN_UNDEF;
2711 
2712 	OUTPUT:
2713 
2714         RETVAL
2715 
2716 int
2717 sync(me)
2718 	DBMS	me
2719 
2720 	PREINIT:
2721 	int retval;
2722 
2723 	CODE:
2724 
2725         if (dbms_comms(me, TOKEN_SYNC, &retval, NULL, NULL, NULL, NULL))
2726                 XSRETURN_UNDEF;
2727 
2728 	RETVAL = (retval == 0) ? 1 : 0;
2729 
2730 	OUTPUT:
2731 
2732         RETVAL
2733 
2734 int
2735 EXISTS(me, key)
2736 	DBMS	me
2737 	DBT	key
2738 
2739         PREINIT:
2740 	int retval;
2741 
2742         CODE:
2743 
2744         if (dbms_comms(me, TOKEN_EXISTS, &retval, &key, NULL,NULL, NULL))
2745                 XSRETURN_UNDEF;
2746 
2747 	RETVAL = (retval == 0) ? 1 : 0;
2748 
2749 	OUTPUT:
2750 
2751         RETVAL
2752 
2753 int
2754 CLEAR(me)
2755 	DBMS	me
2756 
2757         PREINIT:
2758 	int retval;
2759 
2760         CODE:
2761         if (dbms_comms(me, TOKEN_CLEAR, &retval, NULL, NULL, NULL, NULL))
2762                 XSRETURN_UNDEF;
2763 
2764 	RETVAL = (retval == 0) ? 1 : 0;
2765 
2766 	OUTPUT:
2767 
2768         RETVAL
2769 
2770