Chris@45
|
1 /*
|
Chris@45
|
2 Copyright 2011-2016 David Robillard <http://drobilla.net>
|
Chris@45
|
3
|
Chris@45
|
4 Permission to use, copy, modify, and/or distribute this software for any
|
Chris@45
|
5 purpose with or without fee is hereby granted, provided that the above
|
Chris@45
|
6 copyright notice and this permission notice appear in all copies.
|
Chris@45
|
7
|
Chris@45
|
8 THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
Chris@45
|
9 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
Chris@45
|
10 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
Chris@45
|
11 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
Chris@45
|
12 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
Chris@45
|
13 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
Chris@45
|
14 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
Chris@45
|
15 */
|
Chris@45
|
16
|
Chris@45
|
17 /**
|
Chris@45
|
18 @file sord.h API for Sord, a lightweight RDF model library.
|
Chris@45
|
19 */
|
Chris@45
|
20
|
Chris@45
|
21 #ifndef SORD_SORD_H
|
Chris@45
|
22 #define SORD_SORD_H
|
Chris@45
|
23
|
Chris@45
|
24 #include <stddef.h>
|
Chris@45
|
25 #include <stdint.h>
|
Chris@45
|
26 #include <stdio.h>
|
Chris@45
|
27
|
Chris@45
|
28 #include "serd/serd.h"
|
Chris@45
|
29
|
Chris@45
|
30 #ifdef SORD_SHARED
|
Chris@45
|
31 # ifdef _WIN32
|
Chris@45
|
32 # define SORD_LIB_IMPORT __declspec(dllimport)
|
Chris@45
|
33 # define SORD_LIB_EXPORT __declspec(dllexport)
|
Chris@45
|
34 # else
|
Chris@45
|
35 # define SORD_LIB_IMPORT __attribute__((visibility("default")))
|
Chris@45
|
36 # define SORD_LIB_EXPORT __attribute__((visibility("default")))
|
Chris@45
|
37 # endif
|
Chris@45
|
38 # ifdef SORD_INTERNAL
|
Chris@45
|
39 # define SORD_API SORD_LIB_EXPORT
|
Chris@45
|
40 # else
|
Chris@45
|
41 # define SORD_API SORD_LIB_IMPORT
|
Chris@45
|
42 # endif
|
Chris@45
|
43 #else
|
Chris@45
|
44 # define SORD_API
|
Chris@45
|
45 #endif
|
Chris@45
|
46
|
Chris@45
|
47 #ifdef __cplusplus
|
Chris@45
|
48 extern "C" {
|
Chris@45
|
49 #else
|
Chris@45
|
50 # include <stdbool.h>
|
Chris@45
|
51 #endif
|
Chris@45
|
52
|
Chris@45
|
53 /**
|
Chris@45
|
54 @defgroup sord Sord
|
Chris@45
|
55 A lightweight RDF model library.
|
Chris@45
|
56
|
Chris@45
|
57 Sord stores RDF (subject object predicate context) quads, where the context
|
Chris@45
|
58 may be omitted (to represent triples in the default graph).
|
Chris@45
|
59 @{
|
Chris@45
|
60 */
|
Chris@45
|
61
|
Chris@45
|
62 /**
|
Chris@45
|
63 Sord World.
|
Chris@45
|
64 The World represents all library state, including interned strings.
|
Chris@45
|
65 */
|
Chris@45
|
66 typedef struct SordWorldImpl SordWorld;
|
Chris@45
|
67
|
Chris@45
|
68 /**
|
Chris@45
|
69 Sord Model.
|
Chris@45
|
70
|
Chris@45
|
71 A model is an indexed set of Quads (i.e. it can contain several RDF
|
Chris@45
|
72 graphs). It may be searched using various patterns depending on which
|
Chris@45
|
73 indices are enabled.
|
Chris@45
|
74 */
|
Chris@45
|
75 typedef struct SordModelImpl SordModel;
|
Chris@45
|
76
|
Chris@45
|
77 /**
|
Chris@45
|
78 Model Inserter.
|
Chris@45
|
79
|
Chris@45
|
80 An inserter is used for writing statements to a model using the Serd sink
|
Chris@45
|
81 interface. This makes it simple to write to a model directly using a
|
Chris@45
|
82 SerdReader, or any other code that writes statements to a SerdStatementSink.
|
Chris@45
|
83 */
|
Chris@45
|
84 typedef struct SordInserterImpl SordInserter;
|
Chris@45
|
85
|
Chris@45
|
86 /**
|
Chris@45
|
87 Model Iterator.
|
Chris@45
|
88 */
|
Chris@45
|
89 typedef struct SordIterImpl SordIter;
|
Chris@45
|
90
|
Chris@45
|
91 /**
|
Chris@45
|
92 RDF Node.
|
Chris@45
|
93 A Node is a component of a Quad. Nodes may be URIs, blank nodes, or
|
Chris@45
|
94 (in the case of quad objects only) string literals. Literal nodes may
|
Chris@45
|
95 have an associate language or datatype (but not both).
|
Chris@45
|
96 */
|
Chris@45
|
97 typedef struct SordNodeImpl SordNode;
|
Chris@45
|
98
|
Chris@45
|
99 /**
|
Chris@45
|
100 Quad of nodes (a statement), or a quad pattern.
|
Chris@45
|
101
|
Chris@45
|
102 Nodes are ordered (S P O G). The ID of the default graph is 0.
|
Chris@45
|
103 */
|
Chris@45
|
104 typedef const SordNode* SordQuad[4];
|
Chris@45
|
105
|
Chris@45
|
106 /**
|
Chris@45
|
107 Index into a SordQuad.
|
Chris@45
|
108 */
|
Chris@45
|
109 typedef enum {
|
Chris@45
|
110 SORD_SUBJECT = 0, /**< Subject */
|
Chris@45
|
111 SORD_PREDICATE = 1, /**< Predicate ("key") */
|
Chris@45
|
112 SORD_OBJECT = 2, /**< Object ("value") */
|
Chris@45
|
113 SORD_GRAPH = 3 /**< Graph ("context") */
|
Chris@45
|
114 } SordQuadIndex;
|
Chris@45
|
115
|
Chris@45
|
116 /**
|
Chris@45
|
117 Type of a node.
|
Chris@45
|
118 */
|
Chris@45
|
119 typedef enum {
|
Chris@45
|
120 SORD_URI = 1, /**< URI */
|
Chris@45
|
121 SORD_BLANK = 2, /**< Blank node identifier */
|
Chris@45
|
122 SORD_LITERAL = 3 /**< Literal (string with optional lang or datatype) */
|
Chris@45
|
123 } SordNodeType;
|
Chris@45
|
124
|
Chris@45
|
125 /**
|
Chris@45
|
126 Indexing option.
|
Chris@45
|
127 */
|
Chris@45
|
128 typedef enum {
|
Chris@45
|
129 SORD_SPO = 1, /**< Subject, Predicate, Object */
|
Chris@45
|
130 SORD_SOP = 1 << 1, /**< Subject, Object, Predicate */
|
Chris@45
|
131 SORD_OPS = 1 << 2, /**< Object, Predicate, Subject */
|
Chris@45
|
132 SORD_OSP = 1 << 3, /**< Object, Subject, Predicate */
|
Chris@45
|
133 SORD_PSO = 1 << 4, /**< Predicate, Subject, Object */
|
Chris@45
|
134 SORD_POS = 1 << 5 /**< Predicate, Object, Subject */
|
Chris@45
|
135 } SordIndexOption;
|
Chris@45
|
136
|
Chris@45
|
137 /**
|
Chris@45
|
138 @name World
|
Chris@45
|
139 @{
|
Chris@45
|
140 */
|
Chris@45
|
141
|
Chris@45
|
142 /**
|
Chris@45
|
143 Create a new Sord World.
|
Chris@45
|
144 It is safe to use multiple worlds in one process, though no data
|
Chris@45
|
145 (e.g. nodes) can be shared between worlds, and this should be avoided if
|
Chris@45
|
146 possible for performance reasons.
|
Chris@45
|
147 */
|
Chris@45
|
148 SORD_API
|
Chris@45
|
149 SordWorld*
|
Chris@45
|
150 sord_world_new(void);
|
Chris@45
|
151
|
Chris@45
|
152 /**
|
Chris@45
|
153 Free `world`.
|
Chris@45
|
154 */
|
Chris@45
|
155 SORD_API
|
Chris@45
|
156 void
|
Chris@45
|
157 sord_world_free(SordWorld* world);
|
Chris@45
|
158
|
Chris@45
|
159 /**
|
Chris@45
|
160 Set a function to be called when errors occur.
|
Chris@45
|
161
|
Chris@45
|
162 The `error_sink` will be called with `handle` as its first argument. If
|
Chris@45
|
163 no error function is set, errors are printed to stderr.
|
Chris@45
|
164 */
|
Chris@45
|
165 SORD_API
|
Chris@45
|
166 void
|
Chris@45
|
167 sord_world_set_error_sink(SordWorld* world,
|
Chris@45
|
168 SerdErrorSink error_sink,
|
Chris@45
|
169 void* handle);
|
Chris@45
|
170
|
Chris@45
|
171 /**
|
Chris@45
|
172 @}
|
Chris@45
|
173 @name Node
|
Chris@45
|
174 @{
|
Chris@45
|
175 */
|
Chris@45
|
176
|
Chris@45
|
177 /**
|
Chris@45
|
178 Get a URI node from a string.
|
Chris@45
|
179
|
Chris@45
|
180 Note this function measures `str`, which is a common bottleneck.
|
Chris@45
|
181 Use sord_node_from_serd_node() instead if `str` is already measured.
|
Chris@45
|
182 */
|
Chris@45
|
183 SORD_API
|
Chris@45
|
184 SordNode*
|
Chris@45
|
185 sord_new_uri(SordWorld* world, const uint8_t* uri);
|
Chris@45
|
186
|
Chris@45
|
187 /**
|
Chris@45
|
188 Get a URI node from a relative URI string.
|
Chris@45
|
189 */
|
Chris@45
|
190 SORD_API
|
Chris@45
|
191 SordNode*
|
Chris@45
|
192 sord_new_relative_uri(SordWorld* world,
|
Chris@45
|
193 const uint8_t* str,
|
Chris@45
|
194 const uint8_t* base_uri);
|
Chris@45
|
195
|
Chris@45
|
196 /**
|
Chris@45
|
197 Get a blank node from a string.
|
Chris@45
|
198
|
Chris@45
|
199 Note this function measures `str`, which is a common bottleneck.
|
Chris@45
|
200 Use sord_node_from_serd_node() instead if `str` is already measured.
|
Chris@45
|
201 */
|
Chris@45
|
202 SORD_API
|
Chris@45
|
203 SordNode*
|
Chris@45
|
204 sord_new_blank(SordWorld* world, const uint8_t* str);
|
Chris@45
|
205
|
Chris@45
|
206 /**
|
Chris@45
|
207 Get a literal node from a string.
|
Chris@45
|
208
|
Chris@45
|
209 Note this function measures `str`, which is a common bottleneck.
|
Chris@45
|
210 Use sord_node_from_serd_node() instead if `str` is already measured.
|
Chris@45
|
211 */
|
Chris@45
|
212 SORD_API
|
Chris@45
|
213 SordNode*
|
Chris@45
|
214 sord_new_literal(SordWorld* world,
|
Chris@45
|
215 SordNode* datatype,
|
Chris@45
|
216 const uint8_t* str,
|
Chris@45
|
217 const char* lang);
|
Chris@45
|
218
|
Chris@45
|
219 /**
|
Chris@45
|
220 Copy a node (obtain a reference).
|
Chris@45
|
221
|
Chris@45
|
222 Node that since nodes are interned and reference counted, this does not
|
Chris@45
|
223 actually create a deep copy of `node`.
|
Chris@45
|
224 */
|
Chris@45
|
225 SORD_API
|
Chris@45
|
226 SordNode*
|
Chris@45
|
227 sord_node_copy(const SordNode* node);
|
Chris@45
|
228
|
Chris@45
|
229 /**
|
Chris@45
|
230 Free a node (drop a reference).
|
Chris@45
|
231 */
|
Chris@45
|
232 SORD_API
|
Chris@45
|
233 void
|
Chris@45
|
234 sord_node_free(SordWorld* world, SordNode* node);
|
Chris@45
|
235
|
Chris@45
|
236 /**
|
Chris@45
|
237 Return the type of a node (SORD_URI, SORD_BLANK, or SORD_LITERAL).
|
Chris@45
|
238 */
|
Chris@45
|
239 SORD_API
|
Chris@45
|
240 SordNodeType
|
Chris@45
|
241 sord_node_get_type(const SordNode* node);
|
Chris@45
|
242
|
Chris@45
|
243 /**
|
Chris@45
|
244 Return the string value of a node.
|
Chris@45
|
245 */
|
Chris@45
|
246 SORD_API
|
Chris@45
|
247 const uint8_t*
|
Chris@45
|
248 sord_node_get_string(const SordNode* node);
|
Chris@45
|
249
|
Chris@45
|
250 /**
|
Chris@45
|
251 Return the string value of a node, and set `bytes` to its length in bytes.
|
Chris@45
|
252 */
|
Chris@45
|
253 SORD_API
|
Chris@45
|
254 const uint8_t*
|
Chris@45
|
255 sord_node_get_string_counted(const SordNode* node, size_t* bytes);
|
Chris@45
|
256
|
Chris@45
|
257 /**
|
Chris@45
|
258 Return the string value of a node, and set `bytes` to its length in bytes,
|
Chris@45
|
259 and `count` to its length in characters.
|
Chris@45
|
260 */
|
Chris@45
|
261 SORD_API
|
Chris@45
|
262 const uint8_t*
|
Chris@45
|
263 sord_node_get_string_measured(const SordNode* node,
|
Chris@45
|
264 size_t* bytes,
|
Chris@45
|
265 size_t* chars);
|
Chris@45
|
266
|
Chris@45
|
267 /**
|
Chris@45
|
268 Return the language of a literal node (or NULL).
|
Chris@45
|
269 */
|
Chris@45
|
270 SORD_API
|
Chris@45
|
271 const char*
|
Chris@45
|
272 sord_node_get_language(const SordNode* node);
|
Chris@45
|
273
|
Chris@45
|
274 /**
|
Chris@45
|
275 Return the datatype URI of a literal node (or NULL).
|
Chris@45
|
276 */
|
Chris@45
|
277 SORD_API
|
Chris@45
|
278 SordNode*
|
Chris@45
|
279 sord_node_get_datatype(const SordNode* node);
|
Chris@45
|
280
|
Chris@45
|
281 /**
|
Chris@45
|
282 Return the flags (string attributes) of a node.
|
Chris@45
|
283 */
|
Chris@45
|
284 SORD_API
|
Chris@45
|
285 SerdNodeFlags
|
Chris@45
|
286 sord_node_get_flags(const SordNode* node);
|
Chris@45
|
287
|
Chris@45
|
288 /**
|
Chris@45
|
289 Return true iff node can be serialised as an inline object.
|
Chris@45
|
290
|
Chris@45
|
291 More specifically, this returns true iff the node is the object field
|
Chris@45
|
292 of exactly one statement, and therefore can be inlined since it needn't
|
Chris@45
|
293 be referred to by name.
|
Chris@45
|
294 */
|
Chris@45
|
295 SORD_API
|
Chris@45
|
296 bool
|
Chris@45
|
297 sord_node_is_inline_object(const SordNode* node);
|
Chris@45
|
298
|
Chris@45
|
299 /**
|
Chris@45
|
300 Return true iff `a` is equal to `b`.
|
Chris@45
|
301
|
Chris@45
|
302 Note this is much faster than comparing the node's strings.
|
Chris@45
|
303 */
|
Chris@45
|
304 SORD_API
|
Chris@45
|
305 bool
|
Chris@45
|
306 sord_node_equals(const SordNode* a,
|
Chris@45
|
307 const SordNode* b);
|
Chris@45
|
308
|
Chris@45
|
309 /**
|
Chris@45
|
310 Return a SordNode as a SerdNode.
|
Chris@45
|
311
|
Chris@45
|
312 The returned node is shared and must not be freed or modified.
|
Chris@45
|
313 */
|
Chris@45
|
314 SORD_API
|
Chris@45
|
315 const SerdNode*
|
Chris@45
|
316 sord_node_to_serd_node(const SordNode* node);
|
Chris@45
|
317
|
Chris@45
|
318 /**
|
Chris@45
|
319 Create a new SordNode from a SerdNode.
|
Chris@45
|
320
|
Chris@45
|
321 The returned node must be freed using sord_node_free().
|
Chris@45
|
322 */
|
Chris@45
|
323 SORD_API
|
Chris@45
|
324 SordNode*
|
Chris@45
|
325 sord_node_from_serd_node(SordWorld* world,
|
Chris@45
|
326 SerdEnv* env,
|
Chris@45
|
327 const SerdNode* node,
|
Chris@45
|
328 const SerdNode* datatype,
|
Chris@45
|
329 const SerdNode* lang);
|
Chris@45
|
330
|
Chris@45
|
331 /**
|
Chris@45
|
332 @}
|
Chris@45
|
333 @name Model
|
Chris@45
|
334 @{
|
Chris@45
|
335 */
|
Chris@45
|
336
|
Chris@45
|
337 /**
|
Chris@45
|
338 Create a new model.
|
Chris@45
|
339
|
Chris@45
|
340 @param world The world in which to make this model.
|
Chris@45
|
341
|
Chris@45
|
342 @param indices SordIndexOption flags (e.g. SORD_SPO|SORD_OPS). Be sure to
|
Chris@45
|
343 enable an index where the most significant node(s) are not variables in your
|
Chris@45
|
344 queries (e.g. to make (? P O) queries, enable either SORD_OPS or SORD_POS).
|
Chris@45
|
345
|
Chris@45
|
346 @param graphs If true, store (and index) graph contexts.
|
Chris@45
|
347 */
|
Chris@45
|
348 SORD_API
|
Chris@45
|
349 SordModel*
|
Chris@45
|
350 sord_new(SordWorld* world,
|
Chris@45
|
351 unsigned indices,
|
Chris@45
|
352 bool graphs);
|
Chris@45
|
353
|
Chris@45
|
354 /**
|
Chris@45
|
355 Close and free `model`.
|
Chris@45
|
356 */
|
Chris@45
|
357 SORD_API
|
Chris@45
|
358 void
|
Chris@45
|
359 sord_free(SordModel* model);
|
Chris@45
|
360
|
Chris@45
|
361 /**
|
Chris@45
|
362 Get the world associated with `model`.
|
Chris@45
|
363 */
|
Chris@45
|
364 SORD_API
|
Chris@45
|
365 SordWorld*
|
Chris@45
|
366 sord_get_world(SordModel* model);
|
Chris@45
|
367
|
Chris@45
|
368 /**
|
Chris@45
|
369 Return the number of nodes stored in `world`.
|
Chris@45
|
370
|
Chris@45
|
371 Nodes are included in this count iff they are a part of a quad in `world`.
|
Chris@45
|
372 */
|
Chris@45
|
373 SORD_API
|
Chris@45
|
374 size_t
|
Chris@45
|
375 sord_num_nodes(const SordWorld* world);
|
Chris@45
|
376
|
Chris@45
|
377 /**
|
Chris@45
|
378 Return the number of quads stored in `model`.
|
Chris@45
|
379 */
|
Chris@45
|
380 SORD_API
|
Chris@45
|
381 size_t
|
Chris@45
|
382 sord_num_quads(const SordModel* model);
|
Chris@45
|
383
|
Chris@45
|
384 /**
|
Chris@45
|
385 Return an iterator to the start of `model`.
|
Chris@45
|
386 */
|
Chris@45
|
387 SORD_API
|
Chris@45
|
388 SordIter*
|
Chris@45
|
389 sord_begin(const SordModel* model);
|
Chris@45
|
390
|
Chris@45
|
391 /**
|
Chris@45
|
392 Search for statements by a quad pattern.
|
Chris@45
|
393 @return an iterator to the first match, or NULL if no matches found.
|
Chris@45
|
394 */
|
Chris@45
|
395 SORD_API
|
Chris@45
|
396 SordIter*
|
Chris@45
|
397 sord_find(SordModel* model, const SordQuad pat);
|
Chris@45
|
398
|
Chris@45
|
399 /**
|
Chris@45
|
400 Search for statements by nodes.
|
Chris@45
|
401 @return an iterator to the first match, or NULL if no matches found.
|
Chris@45
|
402 */
|
Chris@45
|
403 SORD_API
|
Chris@45
|
404 SordIter*
|
Chris@45
|
405 sord_search(SordModel* model,
|
Chris@45
|
406 const SordNode* s,
|
Chris@45
|
407 const SordNode* p,
|
Chris@45
|
408 const SordNode* o,
|
Chris@45
|
409 const SordNode* g);
|
Chris@45
|
410 /**
|
Chris@45
|
411 Search for a single node that matches a pattern.
|
Chris@45
|
412 Exactly one of `s`, `p`, `o` must be NULL.
|
Chris@45
|
413 This function is mainly useful for predicates that only have one value.
|
Chris@45
|
414 The returned node must be freed using sord_node_free().
|
Chris@45
|
415 @return the first matching node, or NULL if no matches are found.
|
Chris@45
|
416 */
|
Chris@45
|
417 SORD_API
|
Chris@45
|
418 SordNode*
|
Chris@45
|
419 sord_get(SordModel* model,
|
Chris@45
|
420 const SordNode* s,
|
Chris@45
|
421 const SordNode* p,
|
Chris@45
|
422 const SordNode* o,
|
Chris@45
|
423 const SordNode* g);
|
Chris@45
|
424
|
Chris@45
|
425 /**
|
Chris@45
|
426 Return true iff a statement exists.
|
Chris@45
|
427 */
|
Chris@45
|
428 SORD_API
|
Chris@45
|
429 bool
|
Chris@45
|
430 sord_ask(SordModel* model,
|
Chris@45
|
431 const SordNode* s,
|
Chris@45
|
432 const SordNode* p,
|
Chris@45
|
433 const SordNode* o,
|
Chris@45
|
434 const SordNode* g);
|
Chris@45
|
435
|
Chris@45
|
436 /**
|
Chris@45
|
437 Return the number of matching statements.
|
Chris@45
|
438 */
|
Chris@45
|
439 SORD_API
|
Chris@45
|
440 uint64_t
|
Chris@45
|
441 sord_count(SordModel* model,
|
Chris@45
|
442 const SordNode* s,
|
Chris@45
|
443 const SordNode* p,
|
Chris@45
|
444 const SordNode* o,
|
Chris@45
|
445 const SordNode* g);
|
Chris@45
|
446
|
Chris@45
|
447 /**
|
Chris@45
|
448 Check if `model` contains a triple pattern.
|
Chris@45
|
449
|
Chris@45
|
450 @return true if `model` contains a match for `pat`, otherwise false.
|
Chris@45
|
451 */
|
Chris@45
|
452 SORD_API
|
Chris@45
|
453 bool
|
Chris@45
|
454 sord_contains(SordModel* model, const SordQuad pat);
|
Chris@45
|
455
|
Chris@45
|
456 /**
|
Chris@45
|
457 Add a quad to a model.
|
Chris@45
|
458
|
Chris@45
|
459 Calling this function invalidates all iterators on `model`.
|
Chris@45
|
460
|
Chris@45
|
461 @return true on success, false, on error.
|
Chris@45
|
462 */
|
Chris@45
|
463 SORD_API
|
Chris@45
|
464 bool
|
Chris@45
|
465 sord_add(SordModel* model, const SordQuad quad);
|
Chris@45
|
466
|
Chris@45
|
467 /**
|
Chris@45
|
468 Remove a quad from a model.
|
Chris@45
|
469
|
Chris@45
|
470 Calling this function invalidates all iterators on `model`. To remove quads
|
Chris@45
|
471 while iterating, use sord_erase() instead.
|
Chris@45
|
472 */
|
Chris@45
|
473 SORD_API
|
Chris@45
|
474 void
|
Chris@45
|
475 sord_remove(SordModel* model, const SordQuad quad);
|
Chris@45
|
476
|
Chris@45
|
477 /**
|
Chris@45
|
478 Remove a quad from a model via an iterator.
|
Chris@45
|
479
|
Chris@45
|
480 Calling this function invalidates all iterators on `model` except `iter`.
|
Chris@45
|
481
|
Chris@45
|
482 @param model The model which `iter` points to.
|
Chris@45
|
483 @param iter Iterator to the element to erase, which is incremented to the
|
Chris@45
|
484 next value on return.
|
Chris@45
|
485 */
|
Chris@45
|
486 SORD_API
|
Chris@45
|
487 SerdStatus
|
Chris@45
|
488 sord_erase(SordModel* model, SordIter* iter);
|
Chris@45
|
489
|
Chris@45
|
490 /**
|
Chris@45
|
491 @}
|
Chris@45
|
492 @name Inserter
|
Chris@45
|
493 @{
|
Chris@45
|
494 */
|
Chris@45
|
495
|
Chris@45
|
496 /**
|
Chris@45
|
497 Create an inserter for writing statements to a model.
|
Chris@45
|
498 */
|
Chris@45
|
499 SORD_API
|
Chris@45
|
500 SordInserter*
|
Chris@45
|
501 sord_inserter_new(SordModel* model,
|
Chris@45
|
502 SerdEnv* env);
|
Chris@45
|
503
|
Chris@45
|
504 /**
|
Chris@45
|
505 Free an inserter.
|
Chris@45
|
506 */
|
Chris@45
|
507 SORD_API
|
Chris@45
|
508 void
|
Chris@45
|
509 sord_inserter_free(SordInserter* inserter);
|
Chris@45
|
510
|
Chris@45
|
511 /**
|
Chris@45
|
512 Set the current base URI for writing to the model.
|
Chris@45
|
513
|
Chris@45
|
514 Note this function can be safely casted to SerdBaseSink.
|
Chris@45
|
515 */
|
Chris@45
|
516 SORD_API
|
Chris@45
|
517 SerdStatus
|
Chris@45
|
518 sord_inserter_set_base_uri(SordInserter* inserter,
|
Chris@45
|
519 const SerdNode* uri);
|
Chris@45
|
520
|
Chris@45
|
521 /**
|
Chris@45
|
522 Set a namespace prefix for writing to the model.
|
Chris@45
|
523
|
Chris@45
|
524 Note this function can be safely casted to SerdPrefixSink.
|
Chris@45
|
525 */
|
Chris@45
|
526 SORD_API
|
Chris@45
|
527 SerdStatus
|
Chris@45
|
528 sord_inserter_set_prefix(SordInserter* inserter,
|
Chris@45
|
529 const SerdNode* name,
|
Chris@45
|
530 const SerdNode* uri);
|
Chris@45
|
531
|
Chris@45
|
532 /**
|
Chris@45
|
533 Write a statement to the model.
|
Chris@45
|
534
|
Chris@45
|
535 Note this function can be safely casted to SerdStatementSink.
|
Chris@45
|
536 */
|
Chris@45
|
537 SORD_API
|
Chris@45
|
538 SerdStatus
|
Chris@45
|
539 sord_inserter_write_statement(SordInserter* inserter,
|
Chris@45
|
540 SerdStatementFlags flags,
|
Chris@45
|
541 const SerdNode* graph,
|
Chris@45
|
542 const SerdNode* subject,
|
Chris@45
|
543 const SerdNode* predicate,
|
Chris@45
|
544 const SerdNode* object,
|
Chris@45
|
545 const SerdNode* object_datatype,
|
Chris@45
|
546 const SerdNode* object_lang);
|
Chris@45
|
547
|
Chris@45
|
548 /**
|
Chris@45
|
549 @}
|
Chris@45
|
550 @name Iteration
|
Chris@45
|
551 @{
|
Chris@45
|
552 */
|
Chris@45
|
553
|
Chris@45
|
554 /**
|
Chris@45
|
555 Set `quad` to the quad pointed to by `iter`.
|
Chris@45
|
556 */
|
Chris@45
|
557 SORD_API
|
Chris@45
|
558 void
|
Chris@45
|
559 sord_iter_get(const SordIter* iter, SordQuad quad);
|
Chris@45
|
560
|
Chris@45
|
561 /**
|
Chris@45
|
562 Return a field of the quad pointed to by `iter`.
|
Chris@45
|
563
|
Chris@45
|
564 Returns NULL if `iter` is NULL or is at the end.
|
Chris@45
|
565 */
|
Chris@45
|
566 SORD_API
|
Chris@45
|
567 const SordNode*
|
Chris@45
|
568 sord_iter_get_node(const SordIter* iter, SordQuadIndex index);
|
Chris@45
|
569
|
Chris@45
|
570 /**
|
Chris@45
|
571 Return the store pointed to by `iter`.
|
Chris@45
|
572 */
|
Chris@45
|
573 SORD_API
|
Chris@45
|
574 const SordModel*
|
Chris@45
|
575 sord_iter_get_model(SordIter* iter);
|
Chris@45
|
576
|
Chris@45
|
577 /**
|
Chris@45
|
578 Increment `iter` to point to the next statement.
|
Chris@45
|
579 */
|
Chris@45
|
580 SORD_API
|
Chris@45
|
581 bool
|
Chris@45
|
582 sord_iter_next(SordIter* iter);
|
Chris@45
|
583
|
Chris@45
|
584 /**
|
Chris@45
|
585 Return true iff `iter` is at the end of its range.
|
Chris@45
|
586 */
|
Chris@45
|
587 SORD_API
|
Chris@45
|
588 bool
|
Chris@45
|
589 sord_iter_end(const SordIter* iter);
|
Chris@45
|
590
|
Chris@45
|
591 /**
|
Chris@45
|
592 Free `iter`.
|
Chris@45
|
593 */
|
Chris@45
|
594 SORD_API
|
Chris@45
|
595 void
|
Chris@45
|
596 sord_iter_free(SordIter* iter);
|
Chris@45
|
597
|
Chris@45
|
598 /**
|
Chris@45
|
599 @}
|
Chris@45
|
600 @name Utilities
|
Chris@45
|
601 @{
|
Chris@45
|
602 */
|
Chris@45
|
603
|
Chris@45
|
604 /**
|
Chris@45
|
605 Match two quads (using ID comparison only).
|
Chris@45
|
606
|
Chris@45
|
607 This function is a straightforward and fast equivalence match with wildcard
|
Chris@45
|
608 support (ID 0 is a wildcard). It does not actually read node data.
|
Chris@45
|
609 @return true iff `x` and `y` match.
|
Chris@45
|
610 */
|
Chris@45
|
611 SORD_API
|
Chris@45
|
612 bool
|
Chris@45
|
613 sord_quad_match(const SordQuad x, const SordQuad y);
|
Chris@45
|
614
|
Chris@45
|
615 /**
|
Chris@45
|
616 @}
|
Chris@45
|
617 @name Serialisation
|
Chris@45
|
618 @{
|
Chris@45
|
619 */
|
Chris@45
|
620
|
Chris@45
|
621 /**
|
Chris@45
|
622 Return a reader that will read into `model`.
|
Chris@45
|
623 */
|
Chris@45
|
624 SORD_API
|
Chris@45
|
625 SerdReader*
|
Chris@45
|
626 sord_new_reader(SordModel* model,
|
Chris@45
|
627 SerdEnv* env,
|
Chris@45
|
628 SerdSyntax syntax,
|
Chris@45
|
629 SordNode* graph);
|
Chris@45
|
630
|
Chris@45
|
631 /**
|
Chris@45
|
632 Write a model to a writer.
|
Chris@45
|
633 */
|
Chris@45
|
634 SORD_API
|
Chris@45
|
635 bool
|
Chris@45
|
636 sord_write(SordModel* model,
|
Chris@45
|
637 SerdWriter* writer,
|
Chris@45
|
638 SordNode* graph);
|
Chris@45
|
639
|
Chris@45
|
640 /**
|
Chris@45
|
641 Write a range to a writer.
|
Chris@45
|
642
|
Chris@45
|
643 This increments `iter` to its end, then frees it.
|
Chris@45
|
644 */
|
Chris@45
|
645 SORD_API
|
Chris@45
|
646 bool
|
Chris@45
|
647 sord_write_iter(SordIter* iter,
|
Chris@45
|
648 SerdWriter* writer);
|
Chris@45
|
649
|
Chris@45
|
650 /**
|
Chris@45
|
651 @}
|
Chris@45
|
652 @}
|
Chris@45
|
653 */
|
Chris@45
|
654
|
Chris@45
|
655 #ifdef __cplusplus
|
Chris@45
|
656 } /* extern "C" */
|
Chris@45
|
657 #endif
|
Chris@45
|
658
|
Chris@45
|
659 #endif /* SORD_SORD_H */
|