SIONlib  2.0.0-rc.2
Scalable I/O library for parallel access to task-local files
sion_keyvalue.c
1 /****************************************************************************
2 ** SIONLIB http://www.fz-juelich.de/jsc/sionlib **
3 *****************************************************************************
4 ** Copyright (c) 2008-2019 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 
10 #define _XOPEN_SOURCE 700
11 
12 #include <stdint.h>
13 #include <string.h>
14 
15 #include "sion_common.h"
16 #include "sion_const.h"
17 #include "sion_debug.h"
18 #include "sion_enums.h"
19 #include "sion_error_handler.h"
20 #include "sion_fd.h"
21 #include "sion_filedesc.h"
22 #include "sion_internal.h"
23 #include "sion_keyvalue.h"
24 #include "sion_keyvalue_inline.h"
25 
26 #define DFUNCTION "_sion_keyval_check_env"
27 int _sion_keyval_check_env(_sion_filedesc *sion_filedesc, int64_t file_mode_flags)
28 {
29  const char *t;
30  int rc = 1;
31  int32_t keyvalmode_env;
32  int32_t keyvalmode_parm;
33 
34  DPRINTFP((2, DFUNCTION, -1, "keyval mode is initially set to %s\n", sion_keyval_type_to_str((int)sion_filedesc->keyvalmode)));
35 
36  /* check env-var */
37  keyvalmode_env = SION_KEYVAL_NOTSET;
38  t = _sion_getenv("SION_KEYVALUE_MODE");
39  if (t) {
40  if (strstr(t, "inline")) {
41  keyvalmode_env = SION_KEYVAL_INLINE;
42  }
43  if (strstr(t, "meta")) {
44  keyvalmode_env = SION_KEYVAL_META;
45  }
46  if (strstr(t, "hash")) {
47  keyvalmode_env = SION_KEYVAL_HASH;
48  }
49  if (strstr(t, "none")) {
50  keyvalmode_env = SION_KEYVAL_NONE;
51  }
52  if (strstr(t, "unknown")) {
53  keyvalmode_env = SION_KEYVAL_UNKNOWN;
54  }
55  }
56  DPRINTFP((2, DFUNCTION, -1, "keyval mode from env is=%s\n", sion_keyval_type_to_str((int)keyvalmode_env)));
57 
58  /* check file mode from open call */
59  keyvalmode_parm = SION_KEYVAL_NOTSET;
60  if (file_mode_flags & _SION_FMODE_KEYVAL_INLINE) {
61  keyvalmode_parm = SION_KEYVAL_INLINE;
62  }
63  if (file_mode_flags & _SION_FMODE_KEYVAL_META) {
64  keyvalmode_parm = SION_KEYVAL_META;
65  }
66  if (file_mode_flags & _SION_FMODE_KEYVAL_HASH) {
67  keyvalmode_parm = SION_KEYVAL_HASH;
68  }
69  if (file_mode_flags & _SION_FMODE_KEYVAL_NONE) {
70  keyvalmode_parm = SION_KEYVAL_NONE;
71  }
72  if (file_mode_flags & _SION_FMODE_KEYVAL_UNKNOWN) {
73  keyvalmode_parm = SION_KEYVAL_UNKNOWN;
74  }
75  DPRINTFP((2, DFUNCTION, -1, "keyval mode from parameter is=%s\n", sion_keyval_type_to_str((int)keyvalmode_parm)));
76 
77  if (file_mode_flags & _SION_FMODE_READ) {
78  DPRINTFP((2, DFUNCTION, -1, "file is opened for reading\n"));
79  /* keyvalmode is already read from meta-data of file */
80  /* open parameter and environment have to be identical */
81 
82  if (keyvalmode_parm == SION_KEYVAL_UNKNOWN) {
83  /* user will query mode later */
84  DPRINTFP((2, DFUNCTION, -1, "file read: parameter is 'unknown' keyvalmode will taken from file ...\n"));
85 
86  } else {
87  /* check for consistency */
88  if ((keyvalmode_parm != SION_KEYVAL_NOTSET) && (keyvalmode_parm != sion_filedesc->keyvalmode)) {
89  DPRINTFP((
90  2, DFUNCTION, -1, "file read: keyvalmode of file is different to requested keyvalmode from parameter, aborting ...\n"));
91  return _sion_errorprint(0, _SION_ERROR_RETURN,
92  "file read: keyvalmode of file is different to requested keyvalmode from parameter, aborting ...\n");
93  }
94  if ((keyvalmode_env != SION_KEYVAL_NOTSET) && (keyvalmode_env != sion_filedesc->keyvalmode)) {
95  DPRINTFP((2, DFUNCTION, -1,
96  "file read: keyvalmode of file is different to requested keyvalmode from environment, aborting ...\n"));
97  return _sion_errorprint(0, _SION_ERROR_RETURN,
98  "file read: keyvalmode of file is different to requested keyvalmode from env-var, aborting ...\n");
99  }
100  }
101 
102  } else {
103  DPRINTFP((2, DFUNCTION, -1, "file is opened for writing\n"));
104  /* order: first env, then parameter */
105  sion_filedesc->keyvalmode = SION_KEYVAL_NONE;
106  if (keyvalmode_env != SION_KEYVAL_NOTSET) {
107  sion_filedesc->keyvalmode = keyvalmode_env;
108  }
109  if (keyvalmode_parm != SION_KEYVAL_NOTSET) {
110  sion_filedesc->keyvalmode = keyvalmode_parm;
111  }
112  }
113 
114  DPRINTFP((2, DFUNCTION, -1, "keyval mode is=%s\n", sion_keyval_type_to_str((int)sion_filedesc->keyvalmode)));
115  return rc;
116 }
117 #undef DFUNCTION
118 
119 int _sion_keyval_check_env_with_options(_sion_filedesc *sion_filedesc, sion_open_mode open_mode, sion_keyval_mode keyval_mode)
120 {
121  DPRINTFP((2, __func__, -1, "keyval mode is initially set to %s\n", sion_keyval_type_to_str((int)sion_filedesc->keyvalmode)));
122 
123  // check env-var
124  int32_t keyvalmode_env = SION_KEYVAL_NOTSET;
125  const char *t = _sion_getenv("SION_KEYVALUE_MODE");
126  if (t) {
127  if (strstr(t, "inline")) {
128  keyvalmode_env = SION_KEYVAL_INLINE;
129  }
130  if (strstr(t, "meta")) {
131  keyvalmode_env = SION_KEYVAL_META;
132  }
133  if (strstr(t, "hash")) {
134  keyvalmode_env = SION_KEYVAL_HASH;
135  }
136  if (strstr(t, "none")) {
137  keyvalmode_env = SION_KEYVAL_NONE;
138  }
139  if (strstr(t, "unknown")) {
140  keyvalmode_env = SION_KEYVAL_UNKNOWN;
141  }
142  }
143  DPRINTFP((2, __func__, -1, "keyval mode from env is=%s\n", sion_keyval_type_to_str((int)keyvalmode_env)));
144 
145  // check file mode from open call
146  int32_t keyvalmode_parm = SION_KEYVAL_NOTSET;
147  if (keyval_mode == SION_KEYVAL_MODE_INLINE) {
148  keyvalmode_parm = SION_KEYVAL_INLINE;
149  }
150  if (keyval_mode == SION_KEYVAL_MODE_META) {
151  keyvalmode_parm = SION_KEYVAL_META;
152  }
153  if (keyval_mode == SION_KEYVAL_MODE_HASH) {
154  keyvalmode_parm = SION_KEYVAL_HASH;
155  }
156  if (keyval_mode == SION_KEYVAL_MODE_NONE) {
157  keyvalmode_parm = SION_KEYVAL_NONE;
158  }
159  if (keyval_mode == SION_KEYVAL_MODE_UNKNOWN) {
160  keyvalmode_parm = SION_KEYVAL_UNKNOWN;
161  }
162  DPRINTFP((2, __func__, -1, "keyval mode from parameter is=%s\n", sion_keyval_type_to_str((int)keyvalmode_parm)));
163 
164  if (open_mode == SION_OPEN_READ) {
165  DPRINTFP((2, __func__, -1, "file is opened for reading\n"));
166  // keyvalmode is already read from meta-data of file
167  // open parameter and environment have to be identical
168 
169  if (keyvalmode_parm == SION_KEYVAL_UNKNOWN) {
170  // user will query mode later
171  DPRINTFP((2, __func__, -1, "file read: parameter is 'unknown' keyvalmode will taken from file ...\n"));
172 
173  } else {
174  /* check for consistency */
175  if ((keyvalmode_parm != SION_KEYVAL_NOTSET) && (keyvalmode_parm != sion_filedesc->keyvalmode)) {
176  DPRINTFP(
177  (2, __func__, -1, "file read: keyvalmode of file is different to requested keyvalmode from parameter, aborting ...\n"));
178  return _sion_errorprint(0, _SION_ERROR_RETURN,
179  "file read: keyvalmode of file is different to requested keyvalmode from parameter, aborting ...\n");
180  }
181  if ((keyvalmode_env != SION_KEYVAL_NOTSET) && (keyvalmode_env != sion_filedesc->keyvalmode)) {
182  DPRINTFP((2, __func__, -1,
183  "file read: keyvalmode of file is different to requested keyvalmode from environment, aborting ...\n"));
184  return _sion_errorprint(0, _SION_ERROR_RETURN,
185  "file read: keyvalmode of file is different to requested keyvalmode from env-var, aborting ...\n");
186  }
187  }
188 
189  } else {
190  DPRINTFP((2, __func__, -1, "file is opened for writing\n"));
191  /* order: first env, then parameter */
192  sion_filedesc->keyvalmode = SION_KEYVAL_NONE;
193  if (keyvalmode_env != SION_KEYVAL_NOTSET) {
194  sion_filedesc->keyvalmode = keyvalmode_env;
195  }
196  if (keyvalmode_parm != SION_KEYVAL_NOTSET) {
197  sion_filedesc->keyvalmode = keyvalmode_parm;
198  }
199  }
200 
201  DPRINTFP((2, __func__, -1, "keyval mode is=%s\n", sion_keyval_type_to_str((int)sion_filedesc->keyvalmode)));
202  return 1;
203 }
204 
205 /* dup internal data structures from first to second sion_filedesc */
206 #define DFUNCTION "_sion_keyval_dup_dataptr"
207 int _sion_keyval_dup_dataptr(_sion_filedesc *sion_filedesc, _sion_filedesc *new_filedesc)
208 {
209  int rc = 0;
210  DPRINTFP((2, DFUNCTION, -1, "enter\n"));
211 
212  if (sion_filedesc->keyvalmode == SION_KEYVAL_INLINE) {
213  rc = _sion_keyval_dup_dataptr_inline(sion_filedesc, new_filedesc);
214  } else {
215  return _sion_errorprint(
216  0, _SION_ERROR_RETURN, "trying to call sion_keyval_dup_dataptr in inknown keyval mode , aborting ...\n");
217  }
218 
219  DPRINTFP((2, DFUNCTION, -1, "leave\n"));
220  return rc;
221 }
222 #undef DFUNCTION
223 
224 #define DFUNCTION "sion_write_key"
225 size_t sion_write_key(const void *data, uint64_t key, size_t size, size_t nitems, int sid)
226 {
227  size_t rc = 0, frc;
228  size_t len;
229  _sion_filedesc *sion_filedesc;
230 
231  DPRINTFTS(-1, "enter sion_write_key");
232  DPRINTFP((2, DFUNCTION, -1, "enter\n"));
233 
234  if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
235  return _sion_errorprint(0, _SION_ERROR_RETURN, "invalid sion_filedesc, aborting %d ...\n", sid);
236  }
237  if (sion_filedesc->rank < 0) { /* empty file */
238  return SION_NOT_SUCCESS;
239  }
240  DPRINTFP((2, DFUNCTION, -1, "write_key: key=%d size=%d, nitems=%d\n", (int)key, (int)size, (int)nitems));
241 
242  len = size * nitems;
243 
244  /* store key and length */
245  frc = _sion_store_and_write_key_and_len(sion_filedesc, key, len);
246  if (frc != SION_SUCCESS) {
247  return _sion_errorprint_on_rank(
248  -1, _SION_ERROR_RETURN, sion_filedesc->rank, "could not write meta data to file (frc=%d sid=%d) ...", (int)frc, sid);
249  }
250 
251  /* store data */
252  frc = _sion_write_value(sion_filedesc, data, key, len);
253  if (frc != len) {
254  return _sion_errorprint_on_rank(-1, _SION_ERROR_RETURN, sion_filedesc->rank,
255  "could not write data (%d bytes) to file (frc=%d sid=%d) ...", (int)len, (int)frc, sid);
256  }
257 
258  rc = (size_t)len / size;
259 
260  DPRINTFP((2, DFUNCTION, -1, "leave\n"));
261  DPRINTFTS(-1, "leave sion_write_key");
262  return rc;
263 }
264 #undef DFUNCTION
265 
266 size_t sion_fwrite_key(const void *data, uint64_t key, size_t size, size_t nitems, int sid)
267 {
268  return sion_write_key(data, key, size, nitems, sid);
269 }
270 
271 #define DFUNCTION "sion_read_key"
272 size_t sion_read_key(void *data, uint64_t key, size_t size, size_t nitems, int sid)
273 {
274  size_t rc = 0, frc;
275  size_t len, datalen = 0;
276  _sion_filedesc *sion_filedesc;
277 
278  DPRINTFTS(-1, "enter sion_read_key");
279  DPRINTFP((8, DFUNCTION, -1, "enter\n"));
280 
281  if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
282  return _sion_errorprint(0, _SION_ERROR_RETURN, "invalid sion_filedesc, aborting %d ...\n", sid);
283  }
284  if (sion_filedesc->rank < 0) { /* empty file */
285  return SION_NOT_SUCCESS;
286  }
287  DPRINTFP((32, DFUNCTION, -1, "read_key: sid=%d key=%ld size=%d, nitems=%d\n", (int)sid, (long)key, (int)size, (int)nitems));
288 
289  len = size * nitems;
290 
291  /* find key and length */
292  if (_sion_find_and_read_key_and_len(sion_filedesc, key, len, &datalen) != SION_SUCCESS) {
293  DPRINTFP((8, DFUNCTION, -1, "_sion_find_and_read_key_and_len return NOT SUCCESS\n"));
294  return SION_NOT_SUCCESS;
295  }
296 
297  /* read as much elements of size <size> as posible */
298  len = ((int)datalen / size) * size;
299 
300  /* read data */
301  frc = _sion_read_value(sion_filedesc, data, key, len);
302  if (frc != len) {
303  return SION_NOT_SUCCESS;
304  }
305 
306  rc = (size_t)len / size;
307 
308  DPRINTFP((8, DFUNCTION, -1, "leave rc=%d\n", (int)rc));
309  DPRINTFTS(-1, "leave sion_read_key");
310  return rc;
311 }
312 #undef DFUNCTION
313 
314 size_t sion_fread_key(void *data, uint64_t key, size_t size, size_t nitems, int sid)
315 {
316  return sion_read_key(data, key, size, nitems, sid);
317 }
318 
319 #define DFUNCTION "sion_key_full_scan"
320 int sion_key_full_scan(int sid)
321 {
322  size_t rc = SION_NOT_SUCCESS;
323  _sion_filedesc *sion_filedesc;
324 
325  DPRINTFTS(-1, "enter sion_key_full_scan");
326  DPRINTFP((2, DFUNCTION, -1, "enter\n"));
327 
328  if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
329  return _sion_errorprint(0, _SION_ERROR_RETURN, "invalid sion_filedesc, aborting %d ...\n", sid);
330  }
331  if (sion_filedesc->rank < 0) { /* empty file */
332  return SION_NOT_SUCCESS;
333  }
334  if (sion_filedesc->keyvalmode == SION_KEYVAL_INLINE) {
335  rc = _sion_key_full_scan_inline(sion_filedesc);
336  } else {
337  return _sion_errorprint(
338  0, _SION_ERROR_RETURN, "trying to perform full scan of file which is not opened in that mode, aborting ...\n");
339  }
340 
341  DPRINTFP((2, DFUNCTION, -1, "leave\n"));
342  DPRINTFTS(-1, "leave sion_key_full_scan");
343  return rc;
344 }
345 #undef DFUNCTION
346 
347 #define DFUNCTION "sion_read_key_iterator_reset"
349 {
350  size_t rc = SION_NOT_SUCCESS;
351  _sion_filedesc *sion_filedesc;
352 
353  DPRINTFP((2, DFUNCTION, -1, "enter\n"));
354 
355  if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
356  return _sion_errorprint(0, _SION_ERROR_RETURN, "invalid sion_filedesc, aborting %d ...\n", sid);
357  }
358  if (sion_filedesc->rank < 0) { /* empty file */
359  return SION_NOT_SUCCESS;
360  }
361 
362  if (sion_filedesc->keyvalmode == SION_KEYVAL_INLINE) {
363  rc = _sion_iterator_reset_inline(sion_filedesc);
364  } else {
365  return _sion_errorprint(0, _SION_ERROR_RETURN,
366  "trying to reset iterator in keyval mode from file which is not opened in that mode, aborting ...\n");
367  }
368 
369  DPRINTFP((2, DFUNCTION, -1, "leave\n"));
370  return rc;
371 }
372 #undef DFUNCTION
373 
375 {
376  return sion_read_key_iterator_reset(sid);
377 }
378 
379 #define DFUNCTION "sion_read_key_iterator_next"
380 int sion_read_key_iterator_next(int sid, uint64_t *keyptr, size_t *sizeptr)
381 {
382  size_t rc = SION_NOT_SUCCESS;
383  _sion_filedesc *sion_filedesc;
384 
385  DPRINTFP((2, DFUNCTION, -1, "enter\n"));
386 
387  if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
388  return _sion_errorprint(0, _SION_ERROR_RETURN, "invalid sion_filedesc, aborting %d ...\n", sid);
389  }
390  if (sion_filedesc->rank < 0) { /* empty file */
391  return SION_NOT_SUCCESS;
392  }
393  if (sion_filedesc->keyvalmode == SION_KEYVAL_INLINE) {
394  rc = _sion_iterator_next_inline(sion_filedesc, keyptr, sizeptr);
395  DPRINTFP((2, DFUNCTION, -1, "sion_read_key_iterator_next: key=%d size=%d\n", (int)*keyptr, (int)*sizeptr));
396  } else {
397  return _sion_errorprint(0, _SION_ERROR_RETURN,
398  "trying to forward iterator in keyval mode from file which is not opened in that mode, aborting ...\n");
399  }
400 
401  DPRINTFP((2, DFUNCTION, -1, "leave\n"));
402  return rc;
403 }
404 #undef DFUNCTION
405 
406 int sion_fread_key_iterator_next(int sid, uint64_t *keyptr, size_t *sizeptr)
407 {
408  return sion_read_key_iterator_next(sid, keyptr, sizeptr);
409 }
410 
411 #define DFUNCTION "sion_seek_key"
412 int sion_seek_key(int sid, uint64_t key, int entrynum, int64_t posinentry)
413 {
414  size_t rc = SION_NOT_SUCCESS;
415  _sion_filedesc *sion_filedesc;
416 
417  DPRINTFTS(-1, "enter sion_seek_key");
418  DPRINTFP((2, DFUNCTION, -1, "enter\n"));
419 
420  if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
421  return _sion_errorprint(0, _SION_ERROR_RETURN, "invalid sion_filedesc, aborting %d ...\n", sid);
422  }
423  if (sion_filedesc->rank < 0) { /* empty file */
424  return SION_NOT_SUCCESS;
425  }
426 
427  if ((posinentry == SION_CURRENT_POS) && (entrynum != SION_CURRENT_BLOCK)) {
428  return _sion_errorprint(0, _SION_ERROR_RETURN,
429  "Error: SION_CURRENT_POS set in sion_search_key, but blovk is not SION_CURRENT_BLOCK, aborting ...\n");
430  }
431 
432  if (sion_filedesc->keyvalmode == SION_KEYVAL_INLINE) {
433  DPRINTFP((2, DFUNCTION, -1, "sion_seek_key: key=%d entrynum=%d posinentry=%d\n", (int)key, (int)entrynum, (int)posinentry));
434  rc = _sion_seek_key_inline(sion_filedesc, key, entrynum, posinentry);
435  } else {
436  return _sion_errorprint(0, _SION_ERROR_RETURN,
437  "trying to search within key in keyval mode from file which is not opened in that mode, aborting ...\n");
438  }
439 
440  DPRINTFP((2, DFUNCTION, -1, "leave rc=%d\n", rc));
441  DPRINTFTS(-1, "leave sion_seek_key");
442  return rc;
443 }
444 #undef DFUNCTION
445 
446 #define DFUNCTION "sion_get_keyval_mode"
448 {
449  size_t rc = SION_KEYVAL_UNKNOWN;
450 
451  _sion_filedesc *sion_filedesc;
452 
453  DPRINTFTS(-1, "enter sion_get_keyval_mode");
454  DPRINTFP((2, DFUNCTION, -1, "enter\n"));
455 
456  if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
457  return _sion_errorprint(SION_KEYVAL_UNKNOWN, _SION_ERROR_RETURN, "invalid sion_filedesc, aborting %d ...\n", sid);
458  }
459 
460  rc = sion_filedesc->keyvalmode;
461 
462  DPRINTFP((2, DFUNCTION, -1, "leave\n"));
463  DPRINTFTS(-1, "leave sion_get_keyval_mode");
464  return rc;
465 }
466 #undef DFUNCTION
467 
468 #define DFUNCTION "sion_keyval_type_to_str"
469 #define STR_PRT(X) \
470  case X: \
471  return #X
472 char *sion_keyval_type_to_str(int type)
473 {
474  switch (type) {
475  STR_PRT(SION_KEYVAL_NONE);
476  STR_PRT(SION_KEYVAL_INLINE);
477  STR_PRT(SION_KEYVAL_META);
478  STR_PRT(SION_KEYVAL_HASH);
479  STR_PRT(SION_KEYVAL_UNKNOWN);
480  }
481  return "unknown";
482 }
483 #undef DFUNCTION
484 
485 #define DFUNCTION "sion_key_list_iterator_reset"
487 {
488  size_t rc = SION_NOT_SUCCESS;
489  _sion_filedesc *sion_filedesc;
490 
491  DPRINTFP((2, DFUNCTION, -1, "enter\n"));
492 
493  if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
494  return _sion_errorprint(0, _SION_ERROR_RETURN, "invalid sion_filedesc, aborting %d ...\n", sid);
495  }
496  if (sion_filedesc->rank < 0) { /* empty file */
497  return SION_NOT_SUCCESS;
498  }
499 
500  if (sion_filedesc->keyvalmode == SION_KEYVAL_INLINE) {
501  rc = _sion_key_list_iterator_reset_inline(sion_filedesc);
502  } else {
503  return _sion_errorprint(0, _SION_ERROR_RETURN,
504  "trying to reset iterator in keyval mode from file which is not opened in that mode, aborting ...\n");
505  }
506 
507  DPRINTFP((2, DFUNCTION, -1, "leave\n"));
508  return rc;
509 }
510 #undef DFUNCTION
511 
512 #define DFUNCTION "sion_key_list_iterator_next"
513 int sion_key_list_iterator_next(int sid, uint64_t *keyptr)
514 {
515  size_t rc = SION_NOT_SUCCESS;
516  _sion_filedesc *sion_filedesc;
517 
518  DPRINTFP((2, DFUNCTION, -1, "enter\n"));
519 
520  if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
521  return _sion_errorprint(0, _SION_ERROR_RETURN, "invalid sion_filedesc, aborting %d ...\n", sid);
522  }
523  if (sion_filedesc->rank < 0) { /* empty file */
524  return SION_NOT_SUCCESS;
525  }
526  if (sion_filedesc->keyvalmode == SION_KEYVAL_INLINE) {
527  rc = _sion_key_list_iterator_next_inline(sion_filedesc, keyptr);
528  DPRINTFP((2, DFUNCTION, -1, "sion_fread_key_iterator_next: key=%d\n", (int)*keyptr));
529  } else {
530  return _sion_errorprint(0, _SION_ERROR_RETURN,
531  "trying to forward iterator in keyval mode from file which is not opened in that mode, aborting ...\n");
532  }
533 
534  DPRINTFP((2, DFUNCTION, -1, "leave\n"));
535  return rc;
536 }
537 #undef DFUNCTION
538 
539 #define DFUNCTION "sion_key_get_stat"
540 int sion_key_get_stat(int sid, uint64_t key, sion_key_stat_t *keystatptr)
541 {
542  size_t rc = SION_NOT_SUCCESS;
543  _sion_filedesc *sion_filedesc;
544 
545  DPRINTFP((2, DFUNCTION, -1, "enter\n"));
546 
547  if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
548  return _sion_errorprint(0, _SION_ERROR_RETURN, "invalid sion_filedesc, aborting %d ...\n", sid);
549  }
550  if (sion_filedesc->rank < 0) { /* empty file */
551  return SION_NOT_SUCCESS;
552  }
553  if (sion_filedesc->keyvalmode == SION_KEYVAL_INLINE) {
554  rc = _sion_key_get_stat_inline(sion_filedesc, key, keystatptr);
555  DPRINTFP((2, DFUNCTION, -1, "_sion_key_get_stat_inline: key=%d rc=%d\n", (int)key, rc));
556  } else {
557  return _sion_errorprint(
558  0, _SION_ERROR_RETURN, "trying to get stat of key from file which is not opened in that mode, aborting ...\n");
559  }
560 
561  DPRINTFP((2, DFUNCTION, -1, "leave\n"));
562  return rc;
563 }
564 #undef DFUNCTION
565 
566 /* internal wrapper function */
567 
568 #define DFUNCTION "_sion_store_and_write_key_and_len"
569 int _sion_store_and_write_key_and_len(_sion_filedesc *sion_filedesc, uint64_t key, size_t len)
570 {
571  int rc = 0;
572  DPRINTFP((2, DFUNCTION, -1, "enter\n"));
573 
574  if (sion_filedesc->keyvalmode == SION_KEYVAL_INLINE) {
575  rc = _sion_store_and_write_key_and_len_inline(sion_filedesc, key, len);
576  } else {
577  return _sion_errorprint(
578  0, _SION_ERROR_RETURN, "trying to write in keyval mode from file which is not opened in that mode, aborting ...\n");
579  }
580 
581  DPRINTFP((2, DFUNCTION, -1, "leave\n"));
582  return rc;
583 }
584 #undef DFUNCTION
585 
586 #define DFUNCTION "_sion_write_value"
587 int _sion_write_value(_sion_filedesc *sion_filedesc, const void *data, uint64_t key, size_t len)
588 {
589  int rc = 0;
590  DPRINTFP((2, DFUNCTION, -1, "enter\n"));
591 
592  if (sion_filedesc->keyvalmode == SION_KEYVAL_INLINE) {
593  rc = _sion_write_value_inline(sion_filedesc, data, key, len);
594  } else {
595  return _sion_errorprint(
596  0, _SION_ERROR_RETURN, "trying to read in keyval mode from file which is not opened in that mode, aborting ...\n");
597  }
598 
599  DPRINTFP((2, DFUNCTION, -1, "leave\n"));
600  return rc;
601 }
602 #undef DFUNCTION
603 
604 #define DFUNCTION "_sion_find_and_read_key_and_len"
605 int _sion_find_and_read_key_and_len(_sion_filedesc *sion_filedesc, uint64_t key, size_t len, size_t *datalen)
606 {
607  int rc = SION_NOT_SUCCESS;
608  DPRINTFP((2, DFUNCTION, -1, "enter\n"));
609 
610  if (sion_filedesc->keyvalmode == SION_KEYVAL_INLINE) {
611  rc = _sion_find_and_read_key_and_len_inline(sion_filedesc, key, len, datalen);
612  } else {
613  return _sion_errorprint(
614  0, _SION_ERROR_RETURN, "trying to read in keyval mode from file which is not opened in that mode, aborting ...\n");
615  }
616 
617  DPRINTFP((2, DFUNCTION, -1, "leave\n"));
618  return rc;
619 }
620 #undef DFUNCTION
621 
622 #define DFUNCTION "_sion_read_value"
623 int _sion_read_value(_sion_filedesc *sion_filedesc, void *data, uint64_t key, size_t len)
624 {
625  int rc = 0;
626  DPRINTFP((2, DFUNCTION, -1, "enter\n"));
627 
628  if (sion_filedesc->keyvalmode == SION_KEYVAL_INLINE) {
629  rc = _sion_read_value_inline(sion_filedesc, data, key, len);
630  } else {
631  return _sion_errorprint(
632  0, _SION_ERROR_RETURN, "trying to read in keyval mode from file which is not opened in that mode, aborting ...\n");
633  }
634 
635  DPRINTFP((2, DFUNCTION, -1, "leave\n"));
636  return rc;
637 }
638 #undef DFUNCTION
size_t sion_read_key(void *data, uint64_t key, size_t size, size_t nitems, int sid)
Read data for key.
not implemented
Definition: sion_enums.h:41
int sion_read_key_iterator_next(int sid, uint64_t *keyptr, size_t *sizeptr)
Forward to next key.
int sion_key_full_scan(int sid)
Performs a full scan of all meta data in current file.
int sion_key_list_iterator_next(int sid, uint64_t *keyptr)
Forward to next key.
int sion_key_get_stat(int sid, uint64_t key, sion_key_stat_t *keystatptr)
get statistics about key
int sion_fread_key_iterator_next(int sid, uint64_t *keyptr, size_t *sizeptr)
Forward to next key.
#define SION_KEYVAL_UNKNOWN
type UNKNOWN
Definition: sion_const.h:109
#define SION_KEYVAL_NOTSET
no Key-Value Pairs in Chunks
Definition: sion_const.h:111
key-value mechanism with inline storage of meta-data
Definition: sion_enums.h:37
char * sion_keyval_type_to_str(int type)
Returns key value mode as string.
#define SION_CURRENT_BLOCK
Alias for the current block.
Definition: sion_const.h:83
#define SION_KEYVAL_NONE
no Key-Value Pairs in Chunks
Definition: sion_const.h:101
int sion_key_list_iterator_reset(int sid)
Resets key iterator.
do not use key-value mechanism
Definition: sion_enums.h:45
open the file for reading only
Definition: sion_enums.h:29
int sion_seek_key(int sid, uint64_t key, int entrynum, int64_t posinentry)
Seek to position in key.
#define SION_KEYVAL_HASH
use hash data structure to store key-value
Definition: sion_const.h:107
int sion_read_key_iterator_reset(int sid)
Resets key iterator.
#define SION_KEYVAL_META
use meta data block to store keys/len
Definition: sion_const.h:105
sion_keyval_mode
specifies whether to use SIONlib's key-value mechanism for accessing file content and if so in what m...
Definition: sion_enums.h:35
int sion_fread_key_iterator_reset(int sid)
Resets key iterator.
#define SION_KEYVAL_INLINE
use inline records to store key-value
Definition: sion_const.h:103
sion_open_mode
specifies for what type of access to open a file
Definition: sion_enums.h:27
size_t sion_fwrite_key(const void *data, uint64_t key, size_t size, size_t nitems, int sid)
Writes data for key.
size_t sion_fread_key(void *data, uint64_t key, size_t size, size_t nitems, int sid)
Read data for key.
not implemented
Definition: sion_enums.h:39
size_t sion_write_key(const void *data, uint64_t key, size_t size, size_t nitems, int sid)
Writes data for key.
int sion_get_keyval_mode(int sid)
Return selected mode for key value.
#define SION_CURRENT_POS
Alias for the current position in the current block.
Definition: sion_const.h:85
when reading a file, learn appropriate mechanism from file header
Definition: sion_enums.h:43