Volksdata 1.0b12
RDF library and triple store
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.
28
29/*
30 * Define supported codecs.
31 *
32 * Add new codec implementations to this table.
33 */
34#define CODEC_TBL \
35/* #enum suffix #fmt #codec if */ \
36 ENTRY( NT, nt, nt_codec ) \
37 ENTRY( NQ, NQ, nq_codec ) \
38 ENTRY( TTL, ttl, ttl_codec ) \
39 ENTRY( TRIG, trig, trig_codec ) \
40
41
46
47#define ENTRY(a, b, c) VOLK_CODEC_FMT_##a,
49typedef enum {
52#undef ENTRY
53
54
60typedef struct codec_iter_wrapper_t {
61 void *it;
64
65
66#define ENTRY(a, b, c) case VOLK_CODEC_FMT_##a: return &c;
73static inline const VOLK_Codec *
74VOLK_codec_get (const VOLK_CodecFormat fmt)
75{
76 switch (fmt) {
78 default:
79 log_warn ("No codec found for format `%s`.", fmt);
80 return NULL;
81 }
82}
83#undef ENTRY
84
85
86/*
87 * Codec operations.
88 */
89
90
102static inline VOLK_rc
103VOLK_codec_encode_term (const VOLK_Term *term, char **out, VOLK_CodecFormat fmt)
104{
105 const VOLK_Codec *codec = VOLK_codec_get (fmt);
107 return VOLK_NOT_IMPL_ERR;
108
109 return codec->encode_term (term, out);
110}
111
112
125static inline VOLK_CodecIterator *
126VOLK_codec_encode_gr_init (
127 const VOLK_Graph *gr, void *udata, VOLK_CodecFormat fmt)
128{
129 const VOLK_Codec *codec = VOLK_codec_get (fmt);
130 if (UNLIKELY (!(codec->features & VOLK_CODEC_FEAT_ENCODE_GR))) {
131 log_error ("Graph encoding is not supported by this codec.");
132 return NULL;
133 }
134 VOLK_CodecIterator *itw = malloc (sizeof *itw);
135 NLNL (itw);
136 itw->codec = codec;
137 itw->it = codec->encode_graph_init (gr, udata);
138
139 return itw;
140}
141
142
156static inline VOLK_rc
157VOLK_codec_encode_gr_iter (VOLK_CodecIterator *itw, char **res)
158{ return itw->codec->encode_graph_iter (itw->it, res); }
159
160
165static inline void
166VOLK_codec_encode_gr_done (VOLK_CodecIterator *itw)
167{
168 itw->codec->encode_graph_done (itw->it);
169 free (itw);
170}
171
172
173
186static inline VOLK_CodecIterator *
187VOLK_codec_encode_dset_init (VOLK_DataSet *dset, VOLK_CodecFormat fmt)
188{
189 const VOLK_Codec *codec = VOLK_codec_get (fmt);
190 if (UNLIKELY (!(codec->features & VOLK_CODEC_FEAT_ENCODE_DS))) {
191 log_error ("Dataset encoding is not supported by this codec.");
192 return NULL;
193 }
194
195 VOLK_CodecIterator *itw = malloc (sizeof *itw);
196 NLNL (itw);
197 itw->codec = codec;
198 itw->it = codec->encode_dset_init (dset);
199
200 return itw;
201}
202
203
217static inline VOLK_rc
218VOLK_codec_encode_dset_iter (VOLK_CodecIterator *itw, char **res)
219{ return itw->codec->encode_dset_iter (itw->it, res); }
220
221
222
227static inline void
228VOLK_codec_encode_dset_done (VOLK_CodecIterator *itw)
229{
230 itw->codec->encode_dset_done (itw->it);
231 free (itw);
232}
233
234
235/*
236 * Decode functions.
237 */
238
239static inline VOLK_rc
240VOLK_codec_decode_term (
241 const char *data, VOLK_Term **out, VOLK_CodecFormat fmt)
242{
243 const VOLK_Codec *codec = VOLK_codec_get (fmt);
245 return VOLK_NOT_IMPL_ERR;
246 return codec->decode_term (data, out);
247}
248
249
263static inline VOLK_rc
264VOLK_codec_decode_gr (
265 FILE *fh, const char *data, VOLK_Graph *gr, VOLK_CodecFormat fmt)
266{
267 const VOLK_Codec *codec = VOLK_codec_get (fmt);
269 return VOLK_NOT_IMPL_ERR;
270
271 return codec->decode_graph (fh, data, gr);
272}
273
274
289static inline VOLK_rc
290VOLK_codec_decode_dset_txn (
291 void *txn, FILE *fh, const char *data, VOLK_DataSet *dset,
293{
294 const VOLK_Codec *codec = VOLK_codec_get (fmt);
295 if (UNLIKELY (!(codec->features & VOLK_CODEC_FEAT_DECODE_DS))) {
296 log_error ("Store decoding is not supported by this codec.");
297 return VOLK_NOT_IMPL_ERR;
298 }
299
300 return codec->decode_dset (fh, data, dset, txn);
301}
302
304#define VOLK_codec_decode_dset(...) VOLK_codec_decode_dset_txn(NULL, __VA_ARGS__)
305
307
308#endif // VOLK_CODEC_H
#define CODEC_TBL
Definition codec.h:34
#define UNLIKELY(x)
Definition core.h:65
VOLK_CodecFormat
Codec formats available.
Definition codec.h:49
#define NLNL(exp)
Log error and return NULL if exp is NULL.
Definition core.h:427
int VOLK_rc
Return code.
Definition core.h:117
#define VOLK_NOT_IMPL_ERR
Functionality is not implemented.
Definition core.h:176
@ 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.
Codec iterator.
Definition codec.h:60
const VOLK_Codec * codec
Definition codec.h:62
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 data_set.h:26
RDF term.
Definition term.h:61