10 #define _XOPEN_SOURCE 700 15 #include "sion_const.h" 16 #include "sion_debug.h" 17 #include "sion_error_handler.h" 19 #include "sion_filedesc.h" 20 #include "sion_internal.h" 21 #include "sion_keyvalue.h" 22 #include "sion_keyvalue_inline.h" 24 #define DFUNCTION "_sion_keyval_check_env" 25 int _sion_keyval_check_env(_sion_filedesc *sion_filedesc, int64_t file_mode_flags)
29 int32_t keyvalmode_env;
30 int32_t keyvalmode_parm;
32 DPRINTFP((2, DFUNCTION, -1,
"keyval mode is initially set to %s\n",
sion_keyval_type_to_str((
int)sion_filedesc->keyvalmode)));
36 t = _sion_getenv(
"SION_KEYVALUE_MODE");
38 if (strstr(t,
"inline")) {
41 if (strstr(t,
"meta")) {
44 if (strstr(t,
"hash")) {
47 if (strstr(t,
"none")) {
50 if (strstr(t,
"unknown")) {
58 if (file_mode_flags & _SION_FMODE_KEYVAL_INLINE) {
61 if (file_mode_flags & _SION_FMODE_KEYVAL_META) {
64 if (file_mode_flags & _SION_FMODE_KEYVAL_HASH) {
67 if (file_mode_flags & _SION_FMODE_KEYVAL_NONE) {
70 if (file_mode_flags & _SION_FMODE_KEYVAL_UNKNOWN) {
73 DPRINTFP((2, DFUNCTION, -1,
"keyval mode from parameter is=%s\n",
sion_keyval_type_to_str((
int)keyvalmode_parm)));
75 if (file_mode_flags & _SION_FMODE_READ) {
76 DPRINTFP((2, DFUNCTION, -1,
"file is opened for reading\n"));
82 DPRINTFP((2, DFUNCTION, -1,
"file read: parameter is 'unknown' keyvalmode will taken from file ...\n"));
86 if ((keyvalmode_parm !=
SION_KEYVAL_NOTSET) && (keyvalmode_parm != sion_filedesc->keyvalmode)) {
88 2, DFUNCTION, -1,
"file read: keyvalmode of file is different to requested keyvalmode from parameter, aborting ...\n"));
89 return _sion_errorprint(0, _SION_ERROR_RETURN,
90 "file read: keyvalmode of file is different to requested keyvalmode from parameter, aborting ...\n");
92 if ((keyvalmode_env !=
SION_KEYVAL_NOTSET) && (keyvalmode_env != sion_filedesc->keyvalmode)) {
93 DPRINTFP((2, DFUNCTION, -1,
94 "file read: keyvalmode of file is different to requested keyvalmode from environment, aborting ...\n"));
95 return _sion_errorprint(0, _SION_ERROR_RETURN,
96 "file read: keyvalmode of file is different to requested keyvalmode from env-var, aborting ...\n");
101 DPRINTFP((2, DFUNCTION, -1,
"file is opened for writing\n"));
105 sion_filedesc->keyvalmode = keyvalmode_env;
108 sion_filedesc->keyvalmode = keyvalmode_parm;
118 #define DFUNCTION "_sion_keyval_dup_dataptr" 119 int _sion_keyval_dup_dataptr(_sion_filedesc *sion_filedesc, _sion_filedesc *new_filedesc)
122 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
125 rc = _sion_keyval_dup_dataptr_inline(sion_filedesc, new_filedesc);
127 return _sion_errorprint(
128 0, _SION_ERROR_RETURN,
"trying to call sion_keyval_dup_dataptr in inknown keyval mode , aborting ...\n");
131 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
136 #define DFUNCTION "sion_fwrite_key" 137 size_t sion_fwrite_key(
const void *data, uint64_t key,
size_t size,
size_t nitems,
int sid)
141 _sion_filedesc *sion_filedesc;
143 DPRINTFTS(-1,
"enter sion_fwrite_key");
144 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
146 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
147 return _sion_errorprint(0, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
149 if (sion_filedesc->rank < 0) {
150 return SION_NOT_SUCCESS;
152 DPRINTFP((2, DFUNCTION, -1,
"fwrite_key: key=%d size=%d, nitems=%d\n", (
int)key, (
int)size, (
int)nitems));
157 frc = _sion_store_and_write_key_and_len(sion_filedesc, key, len);
158 if (frc != SION_SUCCESS) {
159 return _sion_errorprint_on_rank(
160 -1, _SION_ERROR_RETURN, sion_filedesc->rank,
"could not write meta data to file (frc=%d sid=%d) ...", (
int)frc, sid);
164 frc = _sion_write_value(sion_filedesc, data, key, len);
166 return _sion_errorprint_on_rank(-1, _SION_ERROR_RETURN, sion_filedesc->rank,
167 "could not write data (%d bytes) to file (frc=%d sid=%d) ...", (
int)len, (
int)frc, sid);
170 rc = (size_t)len / size;
172 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
173 DPRINTFTS(-1,
"leave sion_fwrite_key");
178 #define DFUNCTION "sion_fread_key" 179 size_t sion_fread_key(
void *data, uint64_t key,
size_t size,
size_t nitems,
int sid)
182 size_t len, datalen = 0;
183 _sion_filedesc *sion_filedesc;
185 DPRINTFTS(-1,
"enter sion_fread_key");
186 DPRINTFP((8, DFUNCTION, -1,
"enter\n"));
188 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
189 return _sion_errorprint(0, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
191 if (sion_filedesc->rank < 0) {
192 return SION_NOT_SUCCESS;
194 DPRINTFP((32, DFUNCTION, -1,
"fread_key: sid=%d key=%ld size=%d, nitems=%d\n", (
int)sid, (
long)key, (
int)size, (
int)nitems));
199 if (_sion_find_and_read_key_and_len(sion_filedesc, key, len, &datalen) != SION_SUCCESS) {
200 DPRINTFP((8, DFUNCTION, -1,
"_sion_find_and_read_key_and_len return NOT SUCCESS\n"));
201 return SION_NOT_SUCCESS;
205 len = ((int)datalen / size) * size;
208 frc = _sion_read_value(sion_filedesc, data, key, len);
210 return SION_NOT_SUCCESS;
213 rc = (size_t)len / size;
215 DPRINTFP((8, DFUNCTION, -1,
"leave rc=%d\n", (
int)rc));
216 DPRINTFTS(-1,
"leave sion_fread_key");
221 #define DFUNCTION "sion_key_full_scan" 224 size_t rc = SION_NOT_SUCCESS;
225 _sion_filedesc *sion_filedesc;
227 DPRINTFTS(-1,
"enter sion_key_full_scan");
228 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
230 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
231 return _sion_errorprint(0, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
233 if (sion_filedesc->rank < 0) {
234 return SION_NOT_SUCCESS;
237 rc = _sion_key_full_scan_inline(sion_filedesc);
239 return _sion_errorprint(
240 0, _SION_ERROR_RETURN,
"trying to perform full scan of file which is not opened in that mode, aborting ...\n");
243 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
244 DPRINTFTS(-1,
"leave sion_key_full_scan");
249 #define DFUNCTION "sion_fread_key_iterator_reset" 252 size_t rc = SION_NOT_SUCCESS;
253 _sion_filedesc *sion_filedesc;
255 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
257 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
258 return _sion_errorprint(0, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
260 if (sion_filedesc->rank < 0) {
261 return SION_NOT_SUCCESS;
265 rc = _sion_iterator_reset_inline(sion_filedesc);
267 return _sion_errorprint(0, _SION_ERROR_RETURN,
268 "trying to reset iterator in keyval mode from file which is not opened in that mode, aborting ...\n");
271 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
276 #define DFUNCTION "sion_fread_key_iterator_next" 279 size_t rc = SION_NOT_SUCCESS;
280 _sion_filedesc *sion_filedesc;
282 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
284 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
285 return _sion_errorprint(0, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
287 if (sion_filedesc->rank < 0) {
288 return SION_NOT_SUCCESS;
291 rc = _sion_iterator_next_inline(sion_filedesc, keyptr, sizeptr);
292 DPRINTFP((2, DFUNCTION, -1,
"sion_fread_key_iterator_next: key=%d size=%d\n", (
int)*keyptr, (
int)*sizeptr));
294 return _sion_errorprint(0, _SION_ERROR_RETURN,
295 "trying to forward iterator in keyval mode from file which is not opened in that mode, aborting ...\n");
298 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
303 #define DFUNCTION "sion_seek_key" 306 size_t rc = SION_NOT_SUCCESS;
307 _sion_filedesc *sion_filedesc;
309 DPRINTFTS(-1,
"enter sion_seek_key");
310 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
312 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
313 return _sion_errorprint(0, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
315 if (sion_filedesc->rank < 0) {
316 return SION_NOT_SUCCESS;
320 return _sion_errorprint(0, _SION_ERROR_RETURN,
321 "Error: SION_CURRENT_POS set in sion_search_key, but blovk is not SION_CURRENT_BLOCK, aborting ...\n");
325 DPRINTFP((2, DFUNCTION, -1,
"sion_seek_key: key=%d entrynum=%d posinentry=%d\n", (
int)key, (
int)entrynum, (
int)posinentry));
326 rc = _sion_seek_key_inline(sion_filedesc, key, entrynum, posinentry);
328 return _sion_errorprint(0, _SION_ERROR_RETURN,
329 "trying to search within key in keyval mode from file which is not opened in that mode, aborting ...\n");
332 DPRINTFP((2, DFUNCTION, -1,
"leave rc=%d\n", rc));
333 DPRINTFTS(-1,
"leave sion_seek_key");
338 #define DFUNCTION "sion_get_keyval_mode" 343 _sion_filedesc *sion_filedesc;
345 DPRINTFTS(-1,
"enter sion_get_keyval_mode");
346 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
348 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
349 return _sion_errorprint(
SION_KEYVAL_UNKNOWN, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
352 rc = sion_filedesc->keyvalmode;
354 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
355 DPRINTFTS(-1,
"leave sion_get_keyval_mode");
360 #define DFUNCTION "sion_keyval_type_to_str" 377 #define DFUNCTION "sion_key_list_iterator_reset" 380 size_t rc = SION_NOT_SUCCESS;
381 _sion_filedesc *sion_filedesc;
383 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
385 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
386 return _sion_errorprint(0, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
388 if (sion_filedesc->rank < 0) {
389 return SION_NOT_SUCCESS;
393 rc = _sion_key_list_iterator_reset_inline(sion_filedesc);
395 return _sion_errorprint(0, _SION_ERROR_RETURN,
396 "trying to reset iterator in keyval mode from file which is not opened in that mode, aborting ...\n");
399 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
404 #define DFUNCTION "sion_key_list_iterator_next" 407 size_t rc = SION_NOT_SUCCESS;
408 _sion_filedesc *sion_filedesc;
410 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
412 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
413 return _sion_errorprint(0, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
415 if (sion_filedesc->rank < 0) {
416 return SION_NOT_SUCCESS;
419 rc = _sion_key_list_iterator_next_inline(sion_filedesc, keyptr);
420 DPRINTFP((2, DFUNCTION, -1,
"sion_fread_key_iterator_next: key=%d\n", (
int)*keyptr));
422 return _sion_errorprint(0, _SION_ERROR_RETURN,
423 "trying to forward iterator in keyval mode from file which is not opened in that mode, aborting ...\n");
426 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
431 #define DFUNCTION "sion_key_get_stat" 434 size_t rc = SION_NOT_SUCCESS;
435 _sion_filedesc *sion_filedesc;
437 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
439 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
440 return _sion_errorprint(0, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
442 if (sion_filedesc->rank < 0) {
443 return SION_NOT_SUCCESS;
446 rc = _sion_key_get_stat_inline(sion_filedesc, key, keystatptr);
447 DPRINTFP((2, DFUNCTION, -1,
"_sion_key_get_stat_inline: key=%d rc=%d\n", (
int)key, rc));
449 return _sion_errorprint(
450 0, _SION_ERROR_RETURN,
"trying to get stat of key from file which is not opened in that mode, aborting ...\n");
453 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
460 #define DFUNCTION "_sion_store_and_write_key_and_len" 461 int _sion_store_and_write_key_and_len(_sion_filedesc *sion_filedesc, uint64_t key,
size_t len)
464 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
467 rc = _sion_store_and_write_key_and_len_inline(sion_filedesc, key, len);
469 return _sion_errorprint(
470 0, _SION_ERROR_RETURN,
"trying to write in keyval mode from file which is not opened in that mode, aborting ...\n");
473 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
478 #define DFUNCTION "_sion_write_value" 479 int _sion_write_value(_sion_filedesc *sion_filedesc,
const void *data, uint64_t key,
size_t len)
482 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
485 rc = _sion_write_value_inline(sion_filedesc, data, key, len);
487 return _sion_errorprint(
488 0, _SION_ERROR_RETURN,
"trying to read in keyval mode from file which is not opened in that mode, aborting ...\n");
491 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
496 #define DFUNCTION "_sion_find_and_read_key_and_len" 497 int _sion_find_and_read_key_and_len(_sion_filedesc *sion_filedesc, uint64_t key,
size_t len,
size_t *datalen)
499 int rc = SION_NOT_SUCCESS;
500 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
503 rc = _sion_find_and_read_key_and_len_inline(sion_filedesc, key, len, datalen);
505 return _sion_errorprint(
506 0, _SION_ERROR_RETURN,
"trying to read in keyval mode from file which is not opened in that mode, aborting ...\n");
509 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
514 #define DFUNCTION "_sion_read_value" 515 int _sion_read_value(_sion_filedesc *sion_filedesc,
void *data, uint64_t key,
size_t len)
518 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
521 rc = _sion_read_value_inline(sion_filedesc, data, key, len);
523 return _sion_errorprint(
524 0, _SION_ERROR_RETURN,
"trying to read in keyval mode from file which is not opened in that mode, aborting ...\n");
527 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
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
#define SION_KEYVAL_NOTSET
no Key-Value Pairs in Chunks
char * sion_keyval_type_to_str(int type)
Returns key value mode as string.
#define SION_CURRENT_BLOCK
Alias for the current block.
#define SION_KEYVAL_NONE
no Key-Value Pairs in Chunks
int sion_key_list_iterator_reset(int sid)
Resets key iterator.
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
#define SION_KEYVAL_META
use meta data block to store keys/len
int sion_fread_key_iterator_reset(int sid)
Resets key iterator.
#define SION_KEYVAL_INLINE
use inline records to store key-value
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.
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.