10 #define _XOPEN_SOURCE 700
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"
21 #include "sion_filedesc.h"
22 #include "sion_internal.h"
23 #include "sion_keyvalue.h"
24 #include "sion_keyvalue_inline.h"
26 #define DFUNCTION "_sion_keyval_check_env"
27 int _sion_keyval_check_env(_sion_filedesc *sion_filedesc, int64_t file_mode_flags)
31 int32_t keyvalmode_env;
32 int32_t keyvalmode_parm;
34 DPRINTFP((2, DFUNCTION, -1,
"keyval mode is initially set to %s\n",
sion_keyval_type_to_str((
int)sion_filedesc->keyvalmode)));
38 t = _sion_getenv(
"SION_KEYVALUE_MODE");
40 if (strstr(t,
"inline")) {
43 if (strstr(t,
"meta")) {
46 if (strstr(t,
"hash")) {
49 if (strstr(t,
"none")) {
52 if (strstr(t,
"unknown")) {
60 if (file_mode_flags & _SION_FMODE_KEYVAL_INLINE) {
63 if (file_mode_flags & _SION_FMODE_KEYVAL_META) {
66 if (file_mode_flags & _SION_FMODE_KEYVAL_HASH) {
69 if (file_mode_flags & _SION_FMODE_KEYVAL_NONE) {
72 if (file_mode_flags & _SION_FMODE_KEYVAL_UNKNOWN) {
75 DPRINTFP((2, DFUNCTION, -1,
"keyval mode from parameter is=%s\n",
sion_keyval_type_to_str((
int)keyvalmode_parm)));
77 if (file_mode_flags & _SION_FMODE_READ) {
78 DPRINTFP((2, DFUNCTION, -1,
"file is opened for reading\n"));
84 DPRINTFP((2, DFUNCTION, -1,
"file read: parameter is 'unknown' keyvalmode will taken from file ...\n"));
88 if ((keyvalmode_parm !=
SION_KEYVAL_NOTSET) && (keyvalmode_parm != sion_filedesc->keyvalmode)) {
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");
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");
103 DPRINTFP((2, DFUNCTION, -1,
"file is opened for writing\n"));
107 sion_filedesc->keyvalmode = keyvalmode_env;
110 sion_filedesc->keyvalmode = keyvalmode_parm;
121 DPRINTFP((2, __func__, -1,
"keyval mode is initially set to %s\n",
sion_keyval_type_to_str((
int)sion_filedesc->keyvalmode)));
125 const char *t = _sion_getenv(
"SION_KEYVALUE_MODE");
127 if (strstr(t,
"inline")) {
130 if (strstr(t,
"meta")) {
133 if (strstr(t,
"hash")) {
136 if (strstr(t,
"none")) {
139 if (strstr(t,
"unknown")) {
162 DPRINTFP((2, __func__, -1,
"keyval mode from parameter is=%s\n",
sion_keyval_type_to_str((
int)keyvalmode_parm)));
165 DPRINTFP((2, __func__, -1,
"file is opened for reading\n"));
171 DPRINTFP((2, __func__, -1,
"file read: parameter is 'unknown' keyvalmode will taken from file ...\n"));
175 if ((keyvalmode_parm !=
SION_KEYVAL_NOTSET) && (keyvalmode_parm != sion_filedesc->keyvalmode)) {
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");
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");
190 DPRINTFP((2, __func__, -1,
"file is opened for writing\n"));
194 sion_filedesc->keyvalmode = keyvalmode_env;
197 sion_filedesc->keyvalmode = keyvalmode_parm;
206 #define DFUNCTION "_sion_keyval_dup_dataptr"
207 int _sion_keyval_dup_dataptr(_sion_filedesc *sion_filedesc, _sion_filedesc *new_filedesc)
210 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
213 rc = _sion_keyval_dup_dataptr_inline(sion_filedesc, new_filedesc);
215 return _sion_errorprint(
216 0, _SION_ERROR_RETURN,
"trying to call sion_keyval_dup_dataptr in inknown keyval mode , aborting ...\n");
219 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
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)
229 _sion_filedesc *sion_filedesc;
231 DPRINTFTS(-1,
"enter sion_write_key");
232 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
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);
237 if (sion_filedesc->rank < 0) {
238 return SION_NOT_SUCCESS;
240 DPRINTFP((2, DFUNCTION, -1,
"write_key: key=%d size=%d, nitems=%d\n", (
int)key, (
int)size, (
int)nitems));
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);
252 frc = _sion_write_value(sion_filedesc, data, key, 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);
258 rc = (size_t)len / size;
260 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
261 DPRINTFTS(-1,
"leave sion_write_key");
266 size_t sion_fwrite_key(
const void *data, uint64_t key,
size_t size,
size_t nitems,
int sid)
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)
275 size_t len, datalen = 0;
276 _sion_filedesc *sion_filedesc;
278 DPRINTFTS(-1,
"enter sion_read_key");
279 DPRINTFP((8, DFUNCTION, -1,
"enter\n"));
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);
284 if (sion_filedesc->rank < 0) {
285 return SION_NOT_SUCCESS;
287 DPRINTFP((32, DFUNCTION, -1,
"read_key: sid=%d key=%ld size=%d, nitems=%d\n", (
int)sid, (
long)key, (
int)size, (
int)nitems));
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;
298 len = ((int)datalen / size) * size;
301 frc = _sion_read_value(sion_filedesc, data, key, len);
303 return SION_NOT_SUCCESS;
306 rc = (size_t)len / size;
308 DPRINTFP((8, DFUNCTION, -1,
"leave rc=%d\n", (
int)rc));
309 DPRINTFTS(-1,
"leave sion_read_key");
314 size_t sion_fread_key(
void *data, uint64_t key,
size_t size,
size_t nitems,
int sid)
319 #define DFUNCTION "sion_key_full_scan"
322 size_t rc = SION_NOT_SUCCESS;
323 _sion_filedesc *sion_filedesc;
325 DPRINTFTS(-1,
"enter sion_key_full_scan");
326 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
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);
331 if (sion_filedesc->rank < 0) {
332 return SION_NOT_SUCCESS;
335 rc = _sion_key_full_scan_inline(sion_filedesc);
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");
341 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
342 DPRINTFTS(-1,
"leave sion_key_full_scan");
347 #define DFUNCTION "sion_read_key_iterator_reset"
350 size_t rc = SION_NOT_SUCCESS;
351 _sion_filedesc *sion_filedesc;
353 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
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);
358 if (sion_filedesc->rank < 0) {
359 return SION_NOT_SUCCESS;
363 rc = _sion_iterator_reset_inline(sion_filedesc);
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");
369 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
379 #define DFUNCTION "sion_read_key_iterator_next"
382 size_t rc = SION_NOT_SUCCESS;
383 _sion_filedesc *sion_filedesc;
385 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
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);
390 if (sion_filedesc->rank < 0) {
391 return SION_NOT_SUCCESS;
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));
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");
401 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
411 #define DFUNCTION "sion_seek_key"
414 size_t rc = SION_NOT_SUCCESS;
415 _sion_filedesc *sion_filedesc;
417 DPRINTFTS(-1,
"enter sion_seek_key");
418 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
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);
423 if (sion_filedesc->rank < 0) {
424 return SION_NOT_SUCCESS;
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");
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);
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");
440 DPRINTFP((2, DFUNCTION, -1,
"leave rc=%d\n", rc));
441 DPRINTFTS(-1,
"leave sion_seek_key");
446 #define DFUNCTION "sion_get_keyval_mode"
451 _sion_filedesc *sion_filedesc;
453 DPRINTFTS(-1,
"enter sion_get_keyval_mode");
454 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
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);
460 rc = sion_filedesc->keyvalmode;
462 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
463 DPRINTFTS(-1,
"leave sion_get_keyval_mode");
468 #define DFUNCTION "sion_keyval_type_to_str"
485 #define DFUNCTION "sion_key_list_iterator_reset"
488 size_t rc = SION_NOT_SUCCESS;
489 _sion_filedesc *sion_filedesc;
491 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
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);
496 if (sion_filedesc->rank < 0) {
497 return SION_NOT_SUCCESS;
501 rc = _sion_key_list_iterator_reset_inline(sion_filedesc);
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");
507 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
512 #define DFUNCTION "sion_key_list_iterator_next"
515 size_t rc = SION_NOT_SUCCESS;
516 _sion_filedesc *sion_filedesc;
518 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
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);
523 if (sion_filedesc->rank < 0) {
524 return SION_NOT_SUCCESS;
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));
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");
534 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
539 #define DFUNCTION "sion_key_get_stat"
542 size_t rc = SION_NOT_SUCCESS;
543 _sion_filedesc *sion_filedesc;
545 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
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);
550 if (sion_filedesc->rank < 0) {
551 return SION_NOT_SUCCESS;
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));
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");
561 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
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)
572 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
575 rc = _sion_store_and_write_key_and_len_inline(sion_filedesc, key, len);
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");
581 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
586 #define DFUNCTION "_sion_write_value"
587 int _sion_write_value(_sion_filedesc *sion_filedesc,
const void *data, uint64_t key,
size_t len)
590 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
593 rc = _sion_write_value_inline(sion_filedesc, data, key, len);
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");
599 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
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)
607 int rc = SION_NOT_SUCCESS;
608 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
611 rc = _sion_find_and_read_key_and_len_inline(sion_filedesc, key, len, datalen);
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");
617 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
622 #define DFUNCTION "_sion_read_value"
623 int _sion_read_value(_sion_filedesc *sion_filedesc,
void *data, uint64_t key,
size_t len)
626 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
629 rc = _sion_read_value_inline(sion_filedesc, data, key, len);
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");
635 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
#define SION_KEYVAL_INLINE
use inline records to store key-value
sion_open_mode
specifies for what type of access to open a file
#define SION_KEYVAL_HASH
use hash data structure to store key-value
#define SION_KEYVAL_UNKNOWN
type UNKNOWN
#define SION_KEYVAL_NOTSET
no Key-Value Pairs in Chunks
#define SION_CURRENT_BLOCK
Alias for the current block.
#define SION_CURRENT_POS
Alias for the current position in the current block.
#define SION_KEYVAL_META
use meta data block to store keys/len
sion_keyval_mode
specifies whether to use SIONlib's key-value mechanism for accessing file content and if so in what m...
#define SION_KEYVAL_NONE
no Key-Value Pairs in Chunks
@ SION_OPEN_READ
open the file for reading only
@ SION_KEYVAL_MODE_UNKNOWN
when reading a file, learn appropriate mechanism from file header
@ SION_KEYVAL_MODE_META
not implemented
@ SION_KEYVAL_MODE_NONE
do not use key-value mechanism
@ SION_KEYVAL_MODE_HASH
not implemented
@ SION_KEYVAL_MODE_INLINE
key-value mechanism with inline storage of meta-data
size_t sion_read_key(void *data, uint64_t key, size_t size, size_t nitems, int sid)
Read data for key.
char * sion_keyval_type_to_str(int type)
Returns key value mode as string.
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_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.
int sion_key_list_iterator_reset(int sid)
Resets key iterator.
int sion_key_full_scan(int sid)
Performs a full scan of all meta data in current file.
size_t sion_fread_key(void *data, uint64_t key, size_t size, size_t nitems, int sid)
Read data for key.
int sion_fread_key_iterator_next(int sid, uint64_t *keyptr, size_t *sizeptr)
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_seek_key(int sid, uint64_t key, int entrynum, int64_t posinentry)
Seek to position in key.
int sion_fread_key_iterator_reset(int sid)
Resets key iterator.
int sion_key_list_iterator_next(int sid, uint64_t *keyptr)
Forward to next key.
int sion_read_key_iterator_reset(int sid)
Resets key iterator.
int sion_read_key_iterator_next(int sid, uint64_t *keyptr, size_t *sizeptr)
Forward to next key.