annotate win32-mingw/include/sord-0/sord/sordmm.hpp @ 94:d278df1123f9

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