15 #include <sys/types.h> 22 #include "sion_debug.h" 23 #include "sion_filedesc.h" 24 #include "sion_tools.h" 26 #include "sion_file.h" 28 #include "sion_internal.h" 29 #include "sion_internal_seek.h" 31 #include "sion_keyvalue.h" 32 #include "sion_keyvalue_inline.h" 34 #define DFUNCTION "_sion_keyval_check_env" 35 int _sion_keyval_check_env(
_sion_filedesc *sion_filedesc, sion_int64 file_mode_flags) {
38 sion_int32 keyvalmode_env;
39 sion_int32 keyvalmode_parm;
45 t = _sion_getenv(
"SION_KEYVALUE_MODE");
58 if(file_mode_flags&_SION_FMODE_KEYVAL_META) keyvalmode_parm=
SION_KEYVAL_META;
59 if(file_mode_flags&_SION_FMODE_KEYVAL_HASH) keyvalmode_parm=
SION_KEYVAL_HASH;
60 if(file_mode_flags&_SION_FMODE_KEYVAL_NONE) keyvalmode_parm=
SION_KEYVAL_NONE;
62 DPRINTFP((2, DFUNCTION, -1,
"keyval mode from parameter is=%s\n",
sion_keyval_type_to_str((
int) keyvalmode_parm)));
64 if(file_mode_flags&_SION_FMODE_READ) {
65 DPRINTFP((2, DFUNCTION, -1,
"file is opened for reading\n"));
71 DPRINTFP((2, DFUNCTION, -1,
"file read: parameter is 'unknown' keyvalmode will taken from file ...\n"));
76 DPRINTFP((2, DFUNCTION, -1,
"file read: keyvalmode of file is different to requested keyvalmode from parameter, aborting ...\n"));
77 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"file read: keyvalmode of file is different to requested keyvalmode from parameter, aborting ...\n"));
80 DPRINTFP((2, DFUNCTION, -1,
"file read: keyvalmode of file is different to requested keyvalmode from environment, aborting ...\n"));
81 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"file read: keyvalmode of file is different to requested keyvalmode from env-var, aborting ...\n"));
87 DPRINTFP((2, DFUNCTION, -1,
"file is opened for writing\n"));
101 #define DFUNCTION "_sion_keyval_dup_dataptr" 104 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
107 rc=_sion_keyval_dup_dataptr_inline(sion_filedesc,new_filedesc);
109 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"trying to call sion_keyval_dup_dataptr in inknown keyval mode , aborting ...\n"));
112 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
119 #define DFUNCTION "sion_fwrite_key" 135 size_t sion_fwrite_key(
const void *data, uint64_t key,
size_t size,
size_t nitems,
int sid) {
140 DPRINTFTS(-1,
"enter sion_fwrite_key");
141 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
143 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
144 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
145 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
147 if(sion_filedesc->
rank<0) {
148 return(SION_NOT_SUCCESS);
150 DPRINTFP((2, DFUNCTION, -1,
"fwrite_key: key=%d size=%d, nitems=%d\n",(
int) key,(
int) size, (
int) nitems));
155 frc=_sion_store_and_write_key_and_len(sion_filedesc,key,len);
156 if(frc != SION_SUCCESS) {
157 return(_sion_errorprint_on_rank(-1,_SION_ERROR_RETURN,sion_filedesc->
rank,
158 "could not write meta data to file (frc=%d sid=%d) ...", (
int) frc, sid));
162 frc=_sion_write_value(sion_filedesc,data,key,len);
164 return(_sion_errorprint_on_rank(-1,_SION_ERROR_RETURN,sion_filedesc->
rank,
165 "could not write data (%d bytes) to file (frc=%d sid=%d) ...", (
int) len, (
int) frc, sid));
168 rc=(size_t) len / size;
170 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
171 DPRINTFTS(-1,
"leave sion_fwrite_key");
178 #define DFUNCTION "sion_fread_key" 194 size_t sion_fread_key(
void *data, uint64_t key,
size_t size,
size_t nitems,
int sid) {
196 size_t len, datalen=0;
199 DPRINTFTS(-1,
"enter sion_fread_key");
200 DPRINTFP((8, DFUNCTION, -1,
"enter\n"));
202 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
203 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
204 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
206 if(sion_filedesc->
rank<0) {
207 return(SION_NOT_SUCCESS);
209 DPRINTFP((32, DFUNCTION, -1,
"fread_key: sid=%d key=%ld size=%d, nitems=%d\n",(
int) sid, (
long) key,(
int) size, (
int) nitems));
214 if (_sion_find_and_read_key_and_len(sion_filedesc,key,len,&datalen) !=
216 DPRINTFP((8, DFUNCTION, -1,
"_sion_find_and_read_key_and_len return NOT SUCCESS\n"));
217 return(SION_NOT_SUCCESS);
221 len = ( (int) datalen/size ) * size;
224 frc=_sion_read_value(sion_filedesc,data,key,len);
226 return(SION_NOT_SUCCESS);
229 rc=(size_t) len / size;
231 DPRINTFP((8, DFUNCTION, -1,
"leave rc=%d\n",(
int) rc));
232 DPRINTFTS(-1,
"leave sion_fread_key");
237 #define DFUNCTION "sion_key_full_scan" 247 size_t rc=SION_NOT_SUCCESS;
250 DPRINTFTS(-1,
"enter sion_key_full_scan");
251 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
253 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
254 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
255 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
257 if(sion_filedesc->
rank<0) {
258 return(SION_NOT_SUCCESS);
261 rc=_sion_key_full_scan_inline(sion_filedesc);
263 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"trying to perform full scan of file which is not opened in that mode, aborting ...\n"));
266 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
267 DPRINTFTS(-1,
"leave sion_key_full_scan");
273 #define DFUNCTION "sion_fread_key_iterator_reset" 283 size_t rc=SION_NOT_SUCCESS;
286 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
288 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
289 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
290 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
292 if(sion_filedesc->
rank<0) {
293 return(SION_NOT_SUCCESS);
297 rc=_sion_iterator_reset_inline(sion_filedesc);
299 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"trying to reset iterator in keyval mode from file which is not opened in that mode, aborting ...\n"));
302 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
307 #define DFUNCTION "sion_fread_key_iterator_next" 319 size_t rc=SION_NOT_SUCCESS;
322 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
324 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
325 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
326 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
328 if(sion_filedesc->
rank<0) {
329 return(SION_NOT_SUCCESS);
332 rc=_sion_iterator_next_inline(sion_filedesc, keyptr, sizeptr);
333 DPRINTFP((2, DFUNCTION, -1,
"sion_fread_key_iterator_next: key=%d size=%d\n",(
int) *keyptr,(
int) *sizeptr));
335 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"trying to forward iterator in keyval mode from file which is not opened in that mode, aborting ...\n"));
338 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
344 #define DFUNCTION "sion_seek_key" 357 int sion_seek_key(
int sid, uint64_t key,
int entrynum, sion_int64 posinentry) {
358 size_t rc=SION_NOT_SUCCESS;
361 DPRINTFTS(-1,
"enter sion_seek_key");
362 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
364 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
365 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
366 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
368 if(sion_filedesc->
rank<0) {
369 return(SION_NOT_SUCCESS);
373 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"Error: SION_CURRENT_POS set in sion_search_key, but blovk is not SION_CURRENT_BLOCK, aborting ...\n"));
377 DPRINTFP((2, DFUNCTION, -1,
"sion_seek_key: key=%d entrynum=%d posinentry=%d\n",(
int) key,(
int) entrynum, (
int) posinentry));
378 rc=_sion_seek_key_inline(sion_filedesc, key, entrynum, posinentry);
380 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"trying to search within key in keyval mode from file which is not opened in that mode, aborting ...\n"));
383 DPRINTFP((2, DFUNCTION, -1,
"leave rc=%d\n",rc));
384 DPRINTFTS(-1,
"leave sion_seek_key");
389 #define DFUNCTION "sion_get_keyval_mode" 403 DPRINTFTS(-1,
"enter sion_get_keyval_mode");
404 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
406 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
407 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
408 return(_sion_errorprint(
SION_KEYVAL_UNKNOWN,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
413 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
414 DPRINTFTS(-1,
"leave sion_get_keyval_mode");
420 #define DFUNCTION "sion_keyval_type_to_str" 421 #define STR_PRT(X) case X: return # X 444 #define DFUNCTION "sion_key_list_iterator_reset" 454 size_t rc=SION_NOT_SUCCESS;
457 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
459 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
460 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
461 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
463 if(sion_filedesc->
rank<0) {
464 return(SION_NOT_SUCCESS);
468 rc=_sion_key_list_iterator_reset_inline(sion_filedesc);
470 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"trying to reset iterator 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_key_list_iterator_next" 489 size_t rc=SION_NOT_SUCCESS;
492 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
494 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
495 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
496 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
498 if(sion_filedesc->
rank<0) {
499 return(SION_NOT_SUCCESS);
502 rc=_sion_key_list_iterator_next_inline(sion_filedesc, keyptr);
503 DPRINTFP((2, DFUNCTION, -1,
"sion_fread_key_iterator_next: key=%d\n",(
int) *keyptr));
505 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"trying to forward iterator in keyval mode from file which is not opened in that mode, aborting ...\n"));
508 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
513 #define DFUNCTION "sion_key_get_stat" 525 size_t rc=SION_NOT_SUCCESS;
528 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
530 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
531 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
532 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
534 if(sion_filedesc->
rank<0) {
535 return(SION_NOT_SUCCESS);
538 rc=_sion_key_get_stat_inline(sion_filedesc, key, keystatptr);
539 DPRINTFP((2, DFUNCTION, -1,
"_sion_key_get_stat_inline: key=%d rc=%d\n",(
int) key, rc));
541 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"trying to get stat of key from file which is not opened in that mode, aborting ...\n"));
544 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
553 #define DFUNCTION "_sion_store_and_write_key_and_len" 554 int _sion_store_and_write_key_and_len(
_sion_filedesc *sion_filedesc, uint64_t key,
size_t len) {
556 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
559 rc=_sion_store_and_write_key_and_len_inline(sion_filedesc,key,len);
561 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"trying to write in keyval mode from file which is not opened in that mode, aborting ...\n"));
564 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
569 #define DFUNCTION "_sion_write_value" 570 int _sion_write_value(
_sion_filedesc *sion_filedesc,
const void *data, uint64_t key,
size_t len) {
572 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
575 rc=_sion_write_value_inline(sion_filedesc,data,key,len);
577 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"trying to read in keyval mode from file which is not opened in that mode, aborting ...\n"));
580 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
585 #define DFUNCTION "_sion_find_and_read_key_and_len" 586 int _sion_find_and_read_key_and_len(
_sion_filedesc *sion_filedesc, uint64_t key,
size_t len,
size_t *datalen) {
587 int rc = SION_NOT_SUCCESS;
588 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
591 rc=_sion_find_and_read_key_and_len_inline(sion_filedesc, key, len, datalen);
593 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"trying to read in keyval mode from file which is not opened in that mode, aborting ...\n"));
596 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
601 #define DFUNCTION "_sion_read_value" 602 int _sion_read_value(
_sion_filedesc *sion_filedesc,
void *data, uint64_t key,
size_t len) {
604 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
607 rc=_sion_read_value_inline(sion_filedesc,data,key,len);
609 return(_sion_errorprint(0,_SION_ERROR_RETURN,
"trying to read in keyval mode from file which is not opened in that mode, aborting ...\n"));
612 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
int sion_seek_key(int sid, uint64_t key, int entrynum, sion_int64 posinentry)
Seek to position in key.
int sion_key_list_iterator_next(int sid, uint64_t *keyptr)
Forward to next key.
Sion File Descriptor Structure.
int sion_fread_key_iterator_next(int sid, uint64_t *keyptr, size_t *sizeptr)
Forward to next key.
#define SION_KEYVAL_NOTSET
#define SION_KEYVAL_INLINE
char * sion_keyval_type_to_str(int type)
Returns key value mode as string.
#define SION_KEYVAL_UNKNOWN
int sion_fread_key_iterator_reset(int sid)
Resets key iterator.
int sion_key_list_iterator_reset(int sid)
Resets key iterator.
int sion_get_keyval_mode(int sid)
Return selected mode for key value.
#define SION_CURRENT_BLOCK
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.
size_t sion_fwrite_key(const void *data, uint64_t key, size_t size, size_t nitems, int sid)
Writes data for key.
int sion_key_get_stat(int sid, uint64_t key, sion_key_stat_t *keystatptr)
get statistics about key