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