File: 4s-resolve.c

package info (click to toggle)
4store 1.1.6+20151109-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, buster, sid, stretch
  • size: 82,388 kB
  • sloc: ansic: 65,689; sh: 2,916; perl: 2,245; makefile: 281; python: 213
file content (121 lines) | stat: -rw-r--r-- 3,335 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
    4store - a clustered RDF storage and query engine

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
/*
 *  Copyright 2006 Nick Lamb for Garlik.com
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "../common/4store.h"
#include "../common/server.h"
#include "../common/error.h"

static int  segments;

static char *get_uri(fsp_link *link, fs_rid rid)
{
  fs_rid_vector onerid = { .length = 1, .size = 1, .data = &rid };
  fs_resource resource;

  if (fsp_resolve(link, FS_RID_SEGMENT(rid, segments), &onerid, &resource)) {
    return "#error URI#";
  }

  return (char *) resource.lex;
}

static char *get_attr(fsp_link *link, fs_rid rid)
{
  fs_rid_vector onerid = { .length = 1, .size = 1, .data = &rid };
  fs_resource resource;
  if (fsp_resolve(link, FS_RID_SEGMENT(rid, segments), &onerid, &resource)) {
    return "#error attr#";
  }

  return (char *) resource.lex;
}

static char *get_literal(fsp_link *link, fs_rid rid, fs_rid *attr)
{
  fs_rid_vector onerid = { .length = 1, .size = 1, .data = &rid };
  fs_resource resource;

  if (fsp_resolve(link, FS_RID_SEGMENT(rid, segments), &onerid, &resource)) {
    *attr = 0;
    return "#error literal#";
  }

  *attr = resource.attr;

  return (char *) resource.lex;
}

int main(int argc, char *argv[])
{
  char *password = fsp_argv_password(&argc, argv);

  if (argc < 3) {
    fprintf(stderr, "%s revision %s\n", argv[0], FS_FRONTEND_VER);
    fprintf(stderr, "Usage: %s <kbname> <RID>\n", argv[0]);
    exit(1);
  }

  fsp_link *link = fsp_open_link(argv[1], password, FS_OPEN_HINT_RO);

  if (!link) {
    fs_error (LOG_ERR, "couldn't connect to ā€œ%sā€", argv[1]);
    exit(2);
  }

  segments = fsp_link_segments(link);

  for (int v = 2; v < argc; ++v) {
    fs_rid rid, attr;

    rid = strtoull(argv[v], NULL, 16);

    if (FS_RID_NULL == rid) {
      printf("%016llX: RID NULL\n", rid);
    } else if (FS_IS_URI(rid)) {
      char *uri = get_uri(link, rid);
      printf("%016llX: <%s>\n", rid, uri);
    } else if (FS_IS_LITERAL(rid)) {
      char *lex = get_literal(link, rid, &attr);
      if (attr == 0) {
        printf("%016llX: %s\n", rid, lex);
      } else if (FS_IS_URI(attr)) {
        char *uri = get_uri(link, attr);
        printf("%016llX: %s^^<%s>\n", rid, lex, uri);
      } else if (FS_IS_LITERAL(attr)) {
        char *lang = get_attr(link, attr);
        printf("%016llX: %s@%s\n", rid, lex, lang);
      } else {
	printf("ERROR: Some sort of irregular literal\n");
        printf("%016llX: %s\n", rid, lex);
      }
    } else if (FS_IS_BNODE(rid)) {
      printf("%016llX: _:b%llu\n", rid, FS_BNODE_NUM(rid));
    } else {
      printf("ERROR: Unknown resource type\n");
    }
  }

  fsp_close_link(link);
}