Volksdata 1.0b10
RDF library
Loading...
Searching...
No Matches
codec.h
Go to the documentation of this file.
1
19
20#ifndef VOLK_CODEC_H
21#define VOLK_CODEC_H
22
23// Add new codec implementations to this include list.
27
28/*
29 * Define supported codecs.
30 *
31 * Add new codec implementations to this table.
32 */
33#define CODEC_TBL \
34/* #enum suffix #fmt #codec if */ \
35 ENTRY( NT, nt, nt_codec ) \
36 ENTRY( TTL, ttl, ttl_codec ) \
37 ENTRY( TRIG, trig, trig_codec ) \
38
39
44
45#define ENTRY(a, b, c) VOLK_CODEC_FMT_##a,
47typedef enum {
50#undef ENTRY
51
52
58typedef struct codec_iter_wrapper_t {
59 void *it;
62
63
70#define ENTRY(a, b, c) case VOLK_CODEC_FMT_##a: return &c;
71static inline const VOLK_Codec *
72VOLK_codec_get (const VOLK_CodecFormat fmt)
73{
74 switch (fmt) {
76 default:
77 log_warn ("No codec found for format `%s`.", fmt);
78 return NULL;
79 }
80}
81#undef ENTRY
82
83
84/*
85 * Codec operations.
86 */
87
88
100static inline VOLK_rc
101VOLK_codec_encode_term (const VOLK_Term *term, char **out, VOLK_CodecFormat fmt)
102{
103 const VOLK_Codec *codec = VOLK_codec_get (fmt);
105 return VOLK_NOT_IMPL_ERR;
106
107 return codec->encode_term (term, out);
108}
109
110
123static inline VOLK_CodecIterator *
124VOLK_codec_encode_gr_init (
125 const VOLK_Graph *gr, void *udata, VOLK_CodecFormat fmt)
126{
127 const VOLK_Codec *codec = VOLK_codec_get (fmt);
128 if (UNLIKELY (!(codec->features & VOLK_CODEC_FEAT_ENCODE_GR))) {
129 log_error ("Graph encoding is not supported by this codec.");
130 return NULL;
131 }
132 VOLK_CodecIterator *itw = malloc (sizeof *itw);
133 NLNL (itw);
134 itw->codec = codec;
135 itw->it = codec->encode_graph_init (gr, udata);
136
137 return itw;
138}
139
140
154static inline VOLK_rc
155VOLK_codec_encode_gr_iter (VOLK_CodecIterator *itw, char **res)
156{ return itw->codec->encode_graph_iter (itw->it, res); }
157
158
163static inline void
164VOLK_codec_encode_gr_done (VOLK_CodecIterator *itw)
165{
166 itw->codec->encode_graph_done (itw->it);
167 free (itw);
168}
169
170
171
184static inline VOLK_CodecIterator *
185VOLK_codec_encode_dset_init (VOLK_Dataset *dset, VOLK_CodecFormat fmt)
186{
187 const VOLK_Codec *codec = VOLK_codec_get (fmt);
188 if (UNLIKELY (!(codec->features & VOLK_CODEC_FEAT_ENCODE_DS))) {
189 log_error ("Dataset encoding is not supported by this codec.");
190 return NULL;
191 }
192
193 VOLK_CodecIterator *itw = malloc (sizeof *itw);
194 NLNL (itw);
195 itw->codec = codec;
196 itw->it = codec->encode_dset_init (dset);
197
198 return itw;
199}
200
201
215static inline VOLK_rc
216VOLK_codec_encode_dset_iter (VOLK_CodecIterator *itw, char **res)
217{ return itw->codec->encode_dset_iter (itw->it, res); }
218
219
220
225static inline void
226VOLK_codec_encode_dset_done (VOLK_CodecIterator *itw)
227{
228 itw->codec->encode_dset_done (itw->it);
229 free (itw);
230}
231
232
233/*
234 * Decode functions.
235 */
236
237static inline VOLK_rc
238VOLK_codec_decode_term (
239 const char *data, VOLK_Term **out, VOLK_CodecFormat fmt)
240{
241 const VOLK_Codec *codec = VOLK_codec_get (fmt);
243 return VOLK_NOT_IMPL_ERR;
244 return codec->decode_term (data, out);
245}
246
247
261static inline VOLK_rc
262VOLK_codec_decode_gr (
263 FILE *fh, const char *data, VOLK_Graph *gr, VOLK_CodecFormat fmt)
264{
265 const VOLK_Codec *codec = VOLK_codec_get (fmt);
267 return VOLK_NOT_IMPL_ERR;
268
269 return codec->decode_graph (fh, data, gr);
270}
271
272
287static inline VOLK_rc
288VOLK_codec_decode_dset_txn (
289 void *txn, FILE *fh, const char *data, VOLK_Dataset *dset,
291{
292 const VOLK_Codec *codec = VOLK_codec_get (fmt);
293 if (UNLIKELY (!(codec->features & VOLK_CODEC_FEAT_DECODE_DS))) {
294 log_error ("Store decoding is not supported by this codec.");
295 return VOLK_NOT_IMPL_ERR;
296 }
297
298 return codec->decode_dset (fh, data, dset, txn);
299}
300
302#define VOLK_codec_decode_dset(...) VOLK_codec_decode_dset_txn(NULL, __VA_ARGS__)
303
305
306#endif // VOLK_CODEC_H
#define CODEC_TBL
Definition codec.h:33
#define UNLIKELY(x)
Definition core.h:39
#define NLNL(exp)
Log error and return NULL if exp is NULL.
Definition core.h:401
int VOLK_rc
Return code.
Definition core.h:91
#define VOLK_NOT_IMPL_ERR
Functionality is not implemented.
Definition core.h:150
@ VOLK_CODEC_FEAT_DECODE_GR
Supports decoding a graph.
@ VOLK_CODEC_FEAT_ENCODE_GR
Supports encoding a graph.
@ VOLK_CODEC_FEAT_ENCODE_DS
Supports encoding a data set.
@ VOLK_CODEC_FEAT_DECODE_TERM
Supports decoding a single term.
@ VOLK_CODEC_FEAT_ENCODE_TERM
Supports encoding a single term.
@ VOLK_CODEC_FEAT_DECODE_DS
Supports decoding a data set.
VOLK_CodecFormat
Codec formats available.
Definition codec.h:47
Codec iterator.
Definition codec.h:58
const VOLK_Codec * codec
Definition codec.h:60
Codec structure.
encode_term_fn_t encode_term
Feature flags.
encode_dset_done_fn_t encode_dset_done
dataset encoder finalization.
decode_gr_fn_t decode_graph
Graph decoder function.
encode_gr_done_fn_t encode_graph_done
Graph encoder finalization.
encode_dset_init_fn_t encode_dset_init
dataset encoder initialization.
encode_gr_init_fn_t encode_graph_init
Graph encoder initialization.
decode_dset_fn_t decode_dset
Dataset decoder function.
VOLK_CodecFeatures features
decode_term_fn_t decode_term
Term decoder function.
encode_gr_iter_fn_t encode_graph_iter
Graph encoder iteration.
encode_dset_iter_fn_t encode_dset_iter
dataset encoder iteration.
RDF Dataset type.
Definition dataset.h:26
RDF term.
Definition term.h:61