annotate src/sord-0.12.0/sord/sordmm.hpp @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents c7265573341e
children
rev   line source
Chris@0 1 /*
Chris@0 2 Copyright 2011-2013 David Robillard <http://drobilla.net>
Chris@0 3
Chris@0 4 Permission to use, copy, modify, and/or distribute this software for any
Chris@0 5 purpose with or without fee is hereby granted, provided that the above
Chris@0 6 copyright notice and this permission notice appear in all copies.
Chris@0 7
Chris@0 8 THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
Chris@0 9 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
Chris@0 10 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
Chris@0 11 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
Chris@0 12 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
Chris@0 13 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Chris@0 14 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Chris@0 15 */
Chris@0 16
Chris@0 17 /**
Chris@0 18 @file sordmm.hpp
Chris@0 19 Public Sord C++ API.
Chris@0 20 */
Chris@0 21
Chris@0 22 #ifndef SORD_SORDMM_HPP
Chris@0 23 #define SORD_SORDMM_HPP
Chris@0 24
Chris@0 25 #include <cassert>
Chris@0 26 #include <cstring>
Chris@0 27 #include <cstdlib>
Chris@0 28 #include <iostream>
Chris@0 29 #include <set>
Chris@0 30 #include <string>
Chris@0 31 #include <sstream>
Chris@0 32
Chris@0 33 #include "serd/serd.h"
Chris@0 34 #include "sord/sord.h"
Chris@0 35
Chris@0 36 #define SORD_NS_XSD "http://www.w3.org/2001/XMLSchema#"
Chris@0 37
Chris@0 38 namespace Sord {
Chris@0 39
Chris@0 40 /** Utility base class to prevent copying. */
Chris@0 41 class Noncopyable {
Chris@0 42 protected:
Chris@0 43 Noncopyable() {}
Chris@0 44 ~Noncopyable() {}
Chris@0 45 private:
Chris@0 46 Noncopyable(const Noncopyable&);
Chris@0 47 const Noncopyable& operator=(const Noncopyable&);
Chris@0 48 };
Chris@0 49
Chris@0 50 /** C++ wrapper for a Sord object. */
Chris@0 51 template <typename T>
Chris@0 52 class Wrapper {
Chris@0 53 public:
Chris@0 54 inline Wrapper(T c_obj = NULL) : _c_obj(c_obj) {}
Chris@0 55
Chris@0 56 inline T c_obj() { return _c_obj; }
Chris@0 57 inline const T c_obj() const { return _c_obj; }
Chris@0 58
Chris@0 59 protected:
Chris@0 60 T _c_obj;
Chris@0 61 };
Chris@0 62
Chris@0 63 /** Collection of RDF namespaces with prefixes. */
Chris@0 64 class Namespaces : public Wrapper<SerdEnv*> {
Chris@0 65 public:
Chris@0 66 Namespaces() : Wrapper<SerdEnv*>(serd_env_new(NULL)) {}
Chris@0 67 ~Namespaces() { serd_env_free(_c_obj); }
Chris@0 68
Chris@0 69 static inline SerdNode string_to_node(SerdType type, const std::string& s) {
Chris@0 70 SerdNode ret = {
Chris@0 71 (const uint8_t*)s.c_str(), s.length(), s.length(), 0, type };
Chris@0 72 return ret;
Chris@0 73 }
Chris@0 74
Chris@0 75 inline void add(const std::string& name,
Chris@0 76 const std::string& uri) {
Chris@0 77 const SerdNode name_node = string_to_node(SERD_LITERAL, name);
Chris@0 78 const SerdNode uri_node = string_to_node(SERD_URI, uri);
Chris@0 79 serd_env_set_prefix(_c_obj, &name_node, &uri_node);
Chris@0 80 }
Chris@0 81
Chris@0 82 inline std::string qualify(std::string uri) const {
Chris@0 83 const SerdNode uri_node = string_to_node(SERD_URI, uri);
Chris@0 84 SerdNode prefix;
Chris@0 85 SerdChunk suffix;
Chris@0 86 if (serd_env_qualify(_c_obj, &uri_node, &prefix, &suffix)) {
Chris@0 87 std::string ret((const char*)prefix.buf, prefix.n_bytes);
Chris@0 88 ret.append(":").append((const char*)suffix.buf, suffix.len);
Chris@0 89 return ret;
Chris@0 90 }
Chris@0 91 return uri;
Chris@0 92 }
Chris@0 93
Chris@0 94 inline std::string expand(const std::string& curie) const {
Chris@0 95 assert(curie.find(":") != std::string::npos);
Chris@0 96 SerdNode curie_node = string_to_node(SERD_CURIE, curie);
Chris@0 97 SerdChunk uri_prefix;
Chris@0 98 SerdChunk uri_suffix;
Chris@0 99 if (!serd_env_expand(_c_obj, &curie_node, &uri_prefix, &uri_suffix)) {
Chris@0 100 std::string ret((const char*)uri_prefix.buf, uri_prefix.len);
Chris@0 101 ret.append((const char*)uri_suffix.buf, uri_suffix.len);
Chris@0 102 return ret;
Chris@0 103 }
Chris@0 104 std::cerr << "CURIE `" << curie << "' has unknown prefix." << std::endl;
Chris@0 105 return curie;
Chris@0 106 }
Chris@0 107 };
Chris@0 108
Chris@0 109 /** Sord library state. */
Chris@0 110 class World : public Noncopyable, public Wrapper<SordWorld*> {
Chris@0 111 public:
Chris@0 112 inline World()
Chris@0 113 : _next_blank_id(0)
Chris@0 114 {
Chris@0 115 _c_obj = sord_world_new();
Chris@0 116 }
Chris@0 117
Chris@0 118 inline ~World() {
Chris@0 119 sord_world_free(_c_obj);
Chris@0 120 }
Chris@0 121
Chris@0 122 inline uint64_t blank_id() { return _next_blank_id++; }
Chris@0 123
Chris@0 124 inline void add_prefix(const std::string& prefix, const std::string& uri) {
Chris@0 125 _prefixes.add(prefix, uri);
Chris@0 126 }
Chris@0 127
Chris@0 128 inline const Namespaces& prefixes() const { return _prefixes; }
Chris@0 129 inline SordWorld* world() { return _c_obj; }
Chris@0 130
Chris@0 131 private:
Chris@0 132 Namespaces _prefixes;
Chris@0 133 std::set<std::string> _blank_ids;
Chris@0 134 uint64_t _next_blank_id;
Chris@0 135 };
Chris@0 136
Chris@0 137 /** An RDF Node (resource, literal, etc)
Chris@0 138 */
Chris@0 139 class Node : public Wrapper<SordNode*> {
Chris@0 140 public:
Chris@0 141 enum Type {
Chris@0 142 UNKNOWN = 0,
Chris@0 143 URI = SORD_URI,
Chris@0 144 BLANK = SORD_BLANK,
Chris@0 145 LITERAL = SORD_LITERAL
Chris@0 146 };
Chris@0 147
Chris@0 148 inline Node() : Wrapper<SordNode*>(NULL), _world(NULL) {}
Chris@0 149
Chris@0 150 inline Node(World& world, Type t, const std::string& s);
Chris@0 151 inline Node(World& world);
Chris@0 152 inline Node(World& world, const SordNode* node);
Chris@0 153 inline Node(World& world, SordNode* node, bool copy=false);
Chris@0 154 inline Node(const Node& other);
Chris@0 155 inline ~Node();
Chris@0 156
Chris@0 157 inline Type type() const {
Chris@0 158 return _c_obj ? (Type)sord_node_get_type(_c_obj) : UNKNOWN;
Chris@0 159 }
Chris@0 160
Chris@0 161 inline const SordNode* get_node() const { return _c_obj; }
Chris@0 162 inline SordNode* get_node() { return _c_obj; }
Chris@0 163
Chris@0 164 const SerdNode* to_serd_node() {
Chris@0 165 return sord_node_to_serd_node(_c_obj);
Chris@0 166 }
Chris@0 167
Chris@0 168 inline bool is_valid() const { return type() != UNKNOWN; }
Chris@0 169
Chris@0 170 inline bool operator<(const Node& other) const {
Chris@0 171 if (type() != other.type()) {
Chris@0 172 return type() < other.type();
Chris@0 173 } else {
Chris@0 174 return to_string() < other.to_string();
Chris@0 175 }
Chris@0 176 }
Chris@0 177
Chris@0 178 Node& operator=(const Node& other) {
Chris@0 179 if (&other != this) {
Chris@0 180 if (_c_obj) {
Chris@0 181 sord_node_free(_world->c_obj(), _c_obj);
Chris@0 182 }
Chris@0 183 _world = other._world;
Chris@0 184 _c_obj = other._c_obj ? sord_node_copy(other._c_obj) : NULL;
Chris@0 185 }
Chris@0 186 return *this;
Chris@0 187 }
Chris@0 188
Chris@0 189 inline bool operator==(const Node& other) const {
Chris@0 190 return sord_node_equals(_c_obj, other._c_obj);
Chris@0 191 }
Chris@0 192
Chris@0 193 inline const uint8_t* to_u_string() const;
Chris@0 194 inline const char* to_c_string() const;
Chris@0 195 inline std::string to_string() const;
Chris@0 196
Chris@0 197 inline bool is_literal_type(const char* type_uri) const;
Chris@0 198
Chris@0 199 inline bool is_uri() const { return _c_obj && type() == URI; }
Chris@0 200 inline bool is_blank() const { return _c_obj && type() == BLANK; }
Chris@0 201 inline bool is_int() const { return is_literal_type(SORD_NS_XSD "integer"); }
Chris@0 202 inline bool is_float() const { return is_literal_type(SORD_NS_XSD "decimal"); }
Chris@0 203 inline bool is_bool() const { return is_literal_type(SORD_NS_XSD "boolean"); }
Chris@0 204
Chris@0 205 inline int to_int() const;
Chris@0 206 inline float to_float() const;
Chris@0 207 inline bool to_bool() const;
Chris@0 208
Chris@0 209 inline static Node blank_id(World& world, const std::string base="b") {
Chris@0 210 const uint64_t num = world.blank_id();
Chris@0 211 std::ostringstream ss;
Chris@0 212 ss << base << num;
Chris@0 213 return Node(world, Node::BLANK, ss.str());
Chris@0 214 }
Chris@0 215
Chris@0 216 private:
Chris@0 217 World* _world;
Chris@0 218 };
Chris@0 219
Chris@0 220 inline std::ostream&
Chris@0 221 operator<<(std::ostream& os, const Node& node)
Chris@0 222 {
Chris@0 223 return os << node.to_string();
Chris@0 224 }
Chris@0 225
Chris@0 226 class URI : public Node {
Chris@0 227 public:
Chris@0 228 inline URI(World& world, const std::string& s)
Chris@0 229 : Node(world, Node::URI, s) {}
Chris@0 230 inline URI(World& world, const std::string& s, const std::string& base)
Chris@0 231 : Node(world, sord_new_relative_uri(world.world(),
Chris@0 232 (const uint8_t*)s.c_str(),
Chris@0 233 (const uint8_t*)base.c_str()))
Chris@0 234 {}
Chris@0 235 };
Chris@0 236
Chris@0 237 class Curie : public Node {
Chris@0 238 public:
Chris@0 239 inline Curie(World& world, const std::string& s)
Chris@0 240 : Node(world, Node::URI, world.prefixes().expand(s)) {}
Chris@0 241 };
Chris@0 242
Chris@0 243 class Literal : public Node {
Chris@0 244 public:
Chris@0 245 inline Literal(World& world, const std::string& s)
Chris@0 246 : Node(world, Node::LITERAL, s) {}
Chris@0 247
Chris@0 248 static inline Node decimal(World& world, double d, unsigned frac_digits) {
Chris@0 249 const SerdNode val = serd_node_new_decimal(d, 7);
Chris@0 250 const SerdNode type = serd_node_from_string(
Chris@0 251 SERD_URI, (const uint8_t*)SORD_NS_XSD "decimal");
Chris@0 252
Chris@0 253 return Node(
Chris@0 254 world,
Chris@0 255 sord_node_from_serd_node(
Chris@0 256 world.c_obj(), world.prefixes().c_obj(), &val, &type, NULL),
Chris@0 257 false);
Chris@0 258 }
Chris@0 259
Chris@0 260 static inline Node integer(World& world, int64_t i) {
Chris@0 261 const SerdNode val = serd_node_new_integer(i);
Chris@0 262 const SerdNode type = serd_node_from_string(
Chris@0 263 SERD_URI, (const uint8_t*)SORD_NS_XSD "integer");
Chris@0 264
Chris@0 265 return Node(
Chris@0 266 world,
Chris@0 267 sord_node_from_serd_node(
Chris@0 268 world.c_obj(), world.prefixes().c_obj(), &val, &type, NULL),
Chris@0 269 false);
Chris@0 270 }
Chris@0 271 };
Chris@0 272
Chris@0 273 inline
Chris@0 274 Node::Node(World& world, Type type, const std::string& s)
Chris@0 275 : _world(&world)
Chris@0 276 {
Chris@0 277 switch (type) {
Chris@0 278 case URI:
Chris@0 279 _c_obj = sord_new_uri(
Chris@0 280 world.world(), (const unsigned char*)s.c_str());
Chris@0 281 break;
Chris@0 282 case LITERAL:
Chris@0 283 _c_obj = sord_new_literal(
Chris@0 284 world.world(), NULL, (const unsigned char*)s.c_str(), NULL);
Chris@0 285 break;
Chris@0 286 case BLANK:
Chris@0 287 _c_obj = sord_new_blank(
Chris@0 288 world.world(), (const unsigned char*)s.c_str());
Chris@0 289 break;
Chris@0 290 default:
Chris@0 291 _c_obj = NULL;
Chris@0 292 }
Chris@0 293
Chris@0 294 assert(this->type() == type);
Chris@0 295 }
Chris@0 296
Chris@0 297 inline
Chris@0 298 Node::Node(World& world)
Chris@0 299 : _world(&world)
Chris@0 300 {
Chris@0 301 Node me = blank_id(world);
Chris@0 302 *this = me;
Chris@0 303 }
Chris@0 304
Chris@0 305 inline
Chris@0 306 Node::Node(World& world, const SordNode* node)
Chris@0 307 : _world(&world)
Chris@0 308 {
Chris@0 309 _c_obj = sord_node_copy(node);
Chris@0 310 }
Chris@0 311
Chris@0 312 inline
Chris@0 313 Node::Node(World& world, SordNode* node, bool copy)
Chris@0 314 : _world(&world)
Chris@0 315 {
Chris@0 316 _c_obj = copy ? sord_node_copy(node) : node;
Chris@0 317 }
Chris@0 318
Chris@0 319 inline
Chris@0 320 Node::Node(const Node& other)
Chris@0 321 : Wrapper<SordNode*>()
Chris@0 322 , _world(other._world)
Chris@0 323 {
Chris@0 324 if (_world) {
Chris@0 325 _c_obj = other._c_obj ? sord_node_copy(other._c_obj) : NULL;
Chris@0 326 }
Chris@0 327
Chris@0 328 assert((!_c_obj && !other._c_obj) || to_string() == other.to_string());
Chris@0 329 }
Chris@0 330
Chris@0 331 inline
Chris@0 332 Node::~Node()
Chris@0 333 {
Chris@0 334 if (_world) {
Chris@0 335 sord_node_free(_world->c_obj(), _c_obj);
Chris@0 336 }
Chris@0 337 }
Chris@0 338
Chris@0 339 inline std::string
Chris@0 340 Node::to_string() const
Chris@0 341 {
Chris@0 342 return _c_obj ? (const char*)sord_node_get_string(_c_obj) : "";
Chris@0 343 }
Chris@0 344
Chris@0 345 inline const char*
Chris@0 346 Node::to_c_string() const
Chris@0 347 {
Chris@0 348 return (const char*)sord_node_get_string(_c_obj);
Chris@0 349 }
Chris@0 350
Chris@0 351 inline const uint8_t*
Chris@0 352 Node::to_u_string() const
Chris@0 353 {
Chris@0 354 return sord_node_get_string(_c_obj);
Chris@0 355 }
Chris@0 356
Chris@0 357 inline bool
Chris@0 358 Node::is_literal_type(const char* type_uri) const
Chris@0 359 {
Chris@0 360 if (_c_obj && sord_node_get_type(_c_obj) == SORD_LITERAL) {
Chris@0 361 const SordNode* datatype = sord_node_get_datatype(_c_obj);
Chris@0 362 if (datatype && !strcmp((const char*)sord_node_get_string(datatype),
Chris@0 363 type_uri))
Chris@0 364 return true;
Chris@0 365 }
Chris@0 366 return false;
Chris@0 367 }
Chris@0 368
Chris@0 369 inline int
Chris@0 370 Node::to_int() const
Chris@0 371 {
Chris@0 372 assert(is_int());
Chris@0 373 char* endptr;
Chris@0 374 return strtol((const char*)sord_node_get_string(_c_obj), &endptr, 10);
Chris@0 375 }
Chris@0 376
Chris@0 377 inline float
Chris@0 378 Node::to_float() const
Chris@0 379 {
Chris@0 380 assert(is_float());
Chris@0 381 char* endptr;
Chris@0 382 return serd_strtod((const char*)sord_node_get_string(_c_obj), &endptr);
Chris@0 383 }
Chris@0 384
Chris@0 385 inline bool
Chris@0 386 Node::to_bool() const
Chris@0 387 {
Chris@0 388 assert(is_bool());
Chris@0 389 return !strcmp((const char*)sord_node_get_string(_c_obj), "true");
Chris@0 390 }
Chris@0 391
Chris@0 392 struct Iter : public Wrapper<SordIter*> {
Chris@0 393 inline Iter(World& world, SordIter* c_obj)
Chris@0 394 : Wrapper<SordIter*>(c_obj), _world(world) {}
Chris@0 395 inline ~Iter() { sord_iter_free(_c_obj); }
Chris@0 396 inline bool end() const { return sord_iter_end(_c_obj); }
Chris@0 397 inline bool next() const { return sord_iter_next(_c_obj); }
Chris@0 398 inline Iter& operator++() {
Chris@0 399 assert(!end());
Chris@0 400 next();
Chris@0 401 return *this;
Chris@0 402 }
Chris@0 403 inline const Node get_subject() const {
Chris@0 404 SordQuad quad;
Chris@0 405 sord_iter_get(_c_obj, quad);
Chris@0 406 return Node(_world, quad[SORD_SUBJECT]);
Chris@0 407 }
Chris@0 408 inline const Node get_predicate() const {
Chris@0 409 SordQuad quad;
Chris@0 410 sord_iter_get(_c_obj, quad);
Chris@0 411 return Node(_world, quad[SORD_PREDICATE]);
Chris@0 412 }
Chris@0 413 inline const Node get_object() const {
Chris@0 414 SordQuad quad;
Chris@0 415 sord_iter_get(_c_obj, quad);
Chris@0 416 return Node(_world, quad[SORD_OBJECT]);
Chris@0 417 }
Chris@0 418 World& _world;
Chris@0 419 };
Chris@0 420
Chris@0 421 /** An RDF Model (collection of triples).
Chris@0 422 */
Chris@0 423 class Model : public Noncopyable, public Wrapper<SordModel*> {
Chris@0 424 public:
Chris@0 425 inline Model(World& world,
Chris@0 426 const std::string& base_uri,
Chris@0 427 unsigned indices = (SORD_SPO | SORD_OPS),
Chris@0 428 bool graphs = true);
Chris@0 429
Chris@0 430 inline ~Model();
Chris@0 431
Chris@0 432 inline const Node& base_uri() const { return _base; }
Chris@0 433
Chris@0 434 size_t num_quads() const { return sord_num_quads(_c_obj); }
Chris@0 435
Chris@0 436 inline void load_file(SerdEnv* env,
Chris@0 437 SerdSyntax syntax,
Chris@0 438 const std::string& uri,
Chris@0 439 const std::string& base_uri="");
Chris@0 440
Chris@0 441 inline void load_string(SerdEnv* env,
Chris@0 442 SerdSyntax syntax,
Chris@0 443 const char* str,
Chris@0 444 size_t len,
Chris@0 445 const std::string& base_uri);
Chris@0 446
Chris@0 447 inline SerdStatus write_to_file(
Chris@0 448 const std::string& uri,
Chris@0 449 SerdSyntax syntax = SERD_TURTLE,
Chris@0 450 SerdStyle style = (SerdStyle)(SERD_STYLE_ABBREVIATED
Chris@0 451 |SERD_STYLE_CURIED
Chris@0 452 |SERD_STYLE_RESOLVED));
Chris@0 453
Chris@0 454 inline std::string write_to_string(
Chris@0 455 const std::string& base_uri,
Chris@0 456 SerdSyntax syntax = SERD_TURTLE,
Chris@0 457 SerdStyle style = (SerdStyle)(SERD_STYLE_ABBREVIATED
Chris@0 458 |SERD_STYLE_CURIED
Chris@0 459 |SERD_STYLE_RESOLVED));
Chris@0 460
Chris@0 461 inline void add_statement(const Node& subject,
Chris@0 462 const Node& predicate,
Chris@0 463 const Node& object);
Chris@0 464
Chris@0 465 inline Iter find(const Node& subject,
Chris@0 466 const Node& predicate,
Chris@0 467 const Node& object);
Chris@0 468
Chris@0 469 inline Node get(const Node& subject,
Chris@0 470 const Node& predicate,
Chris@0 471 const Node& object);
Chris@0 472
Chris@0 473 inline World& world() const { return _world; }
Chris@0 474
Chris@0 475 private:
Chris@0 476 World& _world;
Chris@0 477 Node _base;
Chris@0 478 SerdWriter* _writer;
Chris@0 479 size_t _next_blank_id;
Chris@0 480 };
Chris@0 481
Chris@0 482 /** Create an empty in-memory RDF model.
Chris@0 483 */
Chris@0 484 inline
Chris@0 485 Model::Model(World& world,
Chris@0 486 const std::string& base_uri,
Chris@0 487 unsigned indices,
Chris@0 488 bool graphs)
Chris@0 489 : _world(world)
Chris@0 490 , _base(world, Node::URI, base_uri)
Chris@0 491 , _writer(NULL)
Chris@0 492 {
Chris@0 493 _c_obj = sord_new(_world.world(), indices, graphs);
Chris@0 494 }
Chris@0 495
Chris@0 496 inline void
Chris@0 497 Model::load_string(SerdEnv* env,
Chris@0 498 SerdSyntax syntax,
Chris@0 499 const char* str,
Chris@0 500 size_t len,
Chris@0 501 const std::string& base_uri)
Chris@0 502 {
Chris@0 503 SerdReader* reader = sord_new_reader(_c_obj, env, syntax, NULL);
Chris@0 504 serd_reader_read_string(reader, (const uint8_t*)str);
Chris@0 505 serd_reader_free(reader);
Chris@0 506 }
Chris@0 507
Chris@0 508 inline Model::~Model()
Chris@0 509 {
Chris@0 510 sord_free(_c_obj);
Chris@0 511 }
Chris@0 512
Chris@0 513 inline void
Chris@0 514 Model::load_file(SerdEnv* env,
Chris@0 515 SerdSyntax syntax,
Chris@0 516 const std::string& data_uri,
Chris@0 517 const std::string& base_uri)
Chris@0 518 {
Chris@0 519 uint8_t* path = serd_file_uri_parse((const uint8_t*)data_uri.c_str(), NULL);
Chris@0 520 if (!path) {
Chris@0 521 fprintf(stderr, "Failed to parse file URI <%s>\n", data_uri.c_str());
Chris@0 522 return;
Chris@0 523 }
Chris@0 524
Chris@0 525 // FIXME: blank prefix parameter?
Chris@0 526 SerdReader* reader = sord_new_reader(_c_obj, env, syntax, NULL);
Chris@0 527 serd_reader_read_file(reader, path);
Chris@0 528 serd_reader_free(reader);
Chris@0 529 free(path);
Chris@0 530 }
Chris@0 531
Chris@0 532 inline SerdStatus
Chris@0 533 Model::write_to_file(const std::string& uri, SerdSyntax syntax, SerdStyle style)
Chris@0 534 {
Chris@0 535 uint8_t* path = serd_file_uri_parse((const uint8_t*)uri.c_str(), NULL);
Chris@0 536 if (!path) {
Chris@0 537 fprintf(stderr, "Failed to parse file URI <%s>\n", uri.c_str());
Chris@0 538 return SERD_ERR_BAD_ARG;
Chris@0 539 }
Chris@0 540
Chris@0 541 FILE* const fd = fopen((const char*)path, "w");
Chris@0 542 if (!fd) {
Chris@0 543 fprintf(stderr, "Failed to open file %s\n", path);
Chris@0 544 free(path);
Chris@0 545 return SERD_ERR_UNKNOWN;
Chris@0 546 }
Chris@0 547 free(path);
Chris@0 548
Chris@0 549 SerdURI base_uri = SERD_URI_NULL;
Chris@0 550 if (serd_uri_parse((const uint8_t*)uri.c_str(), &base_uri)) {
Chris@0 551 fprintf(stderr, "Invalid base URI <%s>\n", uri.c_str());
Chris@0 552 fclose(fd);
Chris@0 553 return SERD_ERR_BAD_ARG;
Chris@0 554 }
Chris@0 555
Chris@0 556 SerdWriter* writer = serd_writer_new(syntax,
Chris@0 557 style,
Chris@0 558 _world.prefixes().c_obj(),
Chris@0 559 &base_uri,
Chris@0 560 serd_file_sink,
Chris@0 561 fd);
Chris@0 562
Chris@0 563 serd_env_foreach(_world.prefixes().c_obj(),
Chris@0 564 (SerdPrefixSink)serd_writer_set_prefix,
Chris@0 565 writer);
Chris@0 566
Chris@0 567 sord_write(_c_obj, writer, 0);
Chris@0 568 serd_writer_free(writer);
Chris@0 569 fclose(fd);
Chris@0 570
Chris@0 571 return SERD_SUCCESS;
Chris@0 572 }
Chris@0 573
Chris@0 574 static size_t
Chris@0 575 string_sink(const void* buf, size_t len, void* stream)
Chris@0 576 {
Chris@0 577 std::string* str = (std::string*)stream;
Chris@0 578 str->append((const char*)buf, len);
Chris@0 579 return len;
Chris@0 580 }
Chris@0 581
Chris@0 582 inline std::string
Chris@0 583 Model::write_to_string(const std::string& base_uri_str,
Chris@0 584 SerdSyntax syntax,
Chris@0 585 SerdStyle style)
Chris@0 586 {
Chris@0 587 SerdURI base_uri = SERD_URI_NULL;
Chris@0 588 if (serd_uri_parse((const uint8_t*)base_uri_str.c_str(), &base_uri)) {
Chris@0 589 fprintf(stderr, "Invalid base URI <%s>\n", base_uri_str.c_str());
Chris@0 590 return "";
Chris@0 591 }
Chris@0 592
Chris@0 593 std::string ret;
Chris@0 594
Chris@0 595 SerdWriter* writer = serd_writer_new(syntax,
Chris@0 596 style,
Chris@0 597 _world.prefixes().c_obj(),
Chris@0 598 &base_uri,
Chris@0 599 string_sink,
Chris@0 600 &ret);
Chris@0 601
Chris@0 602 serd_env_foreach(_world.prefixes().c_obj(),
Chris@0 603 (SerdPrefixSink)serd_writer_set_prefix,
Chris@0 604 writer);
Chris@0 605
Chris@0 606 sord_write(_c_obj, writer, 0);
Chris@0 607
Chris@0 608 serd_writer_free(writer);
Chris@0 609 return ret;
Chris@0 610 }
Chris@0 611
Chris@0 612 inline void
Chris@0 613 Model::add_statement(const Node& subject,
Chris@0 614 const Node& predicate,
Chris@0 615 const Node& object)
Chris@0 616 {
Chris@0 617 SordQuad quad = { subject.c_obj(),
Chris@0 618 predicate.c_obj(),
Chris@0 619 object.c_obj(),
Chris@0 620 NULL };
Chris@0 621
Chris@0 622 sord_add(_c_obj, quad);
Chris@0 623 }
Chris@0 624
Chris@0 625 inline Iter
Chris@0 626 Model::find(const Node& subject,
Chris@0 627 const Node& predicate,
Chris@0 628 const Node& object)
Chris@0 629 {
Chris@0 630 SordQuad quad = { subject.c_obj(),
Chris@0 631 predicate.c_obj(),
Chris@0 632 object.c_obj(),
Chris@0 633 NULL };
Chris@0 634
Chris@0 635 return Iter(_world, sord_find(_c_obj, quad));
Chris@0 636 }
Chris@0 637
Chris@0 638 inline Node
Chris@0 639 Model::get(const Node& subject,
Chris@0 640 const Node& predicate,
Chris@0 641 const Node& object)
Chris@0 642 {
Chris@0 643 SordNode* c_node = sord_get(
Chris@0 644 _c_obj, subject.c_obj(), predicate.c_obj(), object.c_obj(), NULL);
Chris@0 645 Node node(_world, c_node);
Chris@0 646 sord_node_free(_world.c_obj(), c_node);
Chris@0 647 return node;
Chris@0 648 }
Chris@0 649
Chris@0 650 } // namespace Sord
Chris@0 651
Chris@0 652 #endif // SORD_SORDMM_HPP
Chris@0 653