annotate win32-mingw/include/sord/sordmm.hpp @ 163:5cc1366da2e9

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