@@ -34,8 +34,8 @@ kas_strerror(int err)
34
34
ret = "Bad open mode; must be \"r\", \"w\", or \"a\"" ;
35
35
break ;
36
36
case KAS_ERR_BAD_FLAGS :
37
- ret = "Unknown flags specified. Only (KAS_GET_TAKES_OWNERSHIP, "
38
- "KAS_READ_ALL or ) or 0 can be specified "
37
+ ret = "Unknown flags specified. Only (KAS_GET_TAKES_OWNERSHIP and/or "
38
+ "KAS_READ_ALL) or 0 can be specified "
39
39
"for open, and KAS_BORROWS_ARRAY or 0 for put" ;
40
40
break ;
41
41
case KAS_ERR_NO_MEMORY :
@@ -683,14 +683,39 @@ kastore_close(kastore_t *self)
683
683
return ret ;
684
684
}
685
685
686
+ static int
687
+ kastore_find_item (kastore_t * self , const char * key , size_t key_len , kaitem_t * * item )
688
+ {
689
+ int ret = KAS_ERR_KEY_NOT_FOUND ;
690
+ kaitem_t search ;
691
+ search .key = (char * ) malloc (key_len );
692
+ search .key_len = key_len ;
693
+
694
+ if (self -> mode != KAS_READ ) {
695
+ ret = KAS_ERR_ILLEGAL_OPERATION ;
696
+ goto out ;
697
+ }
698
+ if (search .key == NULL ) {
699
+ ret = KAS_ERR_NO_MEMORY ;
700
+ goto out ;
701
+ }
702
+ memcpy (search .key , key , key_len );
703
+ * item = bsearch (
704
+ & search , self -> items , self -> num_items , sizeof (kaitem_t ), compare_items );
705
+ if (* item == NULL ) {
706
+ goto out ;
707
+ }
708
+ ret = 0 ;
709
+ out :
710
+ kas_safe_free (search .key );
711
+ return ret ;
712
+ }
713
+
686
714
int KAS_WARN_UNUSED
687
715
kastore_contains (kastore_t * self , const char * key , size_t key_len )
688
716
{
689
- void * array ;
690
- size_t array_len ;
691
- int type ;
692
- int ret = kastore_get (self , key , key_len , & array , & array_len , & type );
693
-
717
+ kaitem_t * item ;
718
+ int ret = kastore_find_item (self , key , key_len , & item );
694
719
if (ret == 0 ) {
695
720
ret = 1 ;
696
721
} else if (ret == KAS_ERR_KEY_NOT_FOUND ) {
@@ -709,24 +734,9 @@ int KAS_WARN_UNUSED
709
734
kastore_get (kastore_t * self , const char * key , size_t key_len , void * * array ,
710
735
size_t * array_len , int * type )
711
736
{
712
- int ret = KAS_ERR_KEY_NOT_FOUND ;
713
- kaitem_t search ;
714
737
kaitem_t * item ;
715
- search .key = (char * ) malloc (key_len );
716
- search .key_len = key_len ;
717
-
718
- if (self -> mode != KAS_READ ) {
719
- ret = KAS_ERR_ILLEGAL_OPERATION ;
720
- goto out ;
721
- }
722
- if (search .key == NULL ) {
723
- ret = KAS_ERR_NO_MEMORY ;
724
- goto out ;
725
- }
726
- memcpy (search .key , key , key_len );
727
- item = bsearch (
728
- & search , self -> items , self -> num_items , sizeof (kaitem_t ), compare_items );
729
- if (item == NULL ) {
738
+ int ret = kastore_find_item (self , key , key_len , & item );
739
+ if (ret != 0 ) {
730
740
goto out ;
731
741
}
732
742
if (item -> array == NULL ) {
@@ -743,7 +753,6 @@ kastore_get(kastore_t *self, const char *key, size_t key_len, void **array,
743
753
}
744
754
ret = 0 ;
745
755
out :
746
- kas_safe_free (search .key );
747
756
return ret ;
748
757
}
749
758
@@ -908,13 +917,13 @@ kastore_bput(kastore_t *self, const char *key, size_t key_len, const void *array
908
917
if (ret != 0 ) {
909
918
goto out ;
910
919
}
911
- /* TEMP FIX UNTIL NEXT KASTORE RELEASE WITH
912
- * https://github.com/tskit-dev/kastore/pull/185 */
913
920
if (array == NULL ) {
921
+ /* Both can't be null, so assign a dummy array */
914
922
item -> array = malloc (1 );
915
923
} else {
916
924
item -> borrowed_array = array ;
917
925
}
926
+ item -> borrowed_array = array ;
918
927
item -> array_len = array_len ;
919
928
out :
920
929
return ret ;
@@ -1154,10 +1163,10 @@ kastore_print_state(kastore_t *self, FILE *out)
1154
1163
item = self -> items + j ;
1155
1164
fprintf (out ,
1156
1165
"%.*s: type=%d, key_start=%zu, key_len=%zu, key=%p, "
1157
- "array_start=%zu, array_len=%zu, array=%p, borrowed_array=%p \n" ,
1166
+ "array_start=%zu, array_len=%zu, array=%p\n" ,
1158
1167
(int ) item -> key_len , item -> key , item -> type , item -> key_start , item -> key_len ,
1159
- (void * ) item -> key , item -> array_start , item -> array_len , ( void * ) item -> array ,
1160
- (void * ) item -> borrowed_array );
1168
+ (void * ) item -> key , item -> array_start , item -> array_len ,
1169
+ (void * ) item -> array );
1161
1170
}
1162
1171
fprintf (out , "============================\n" );
1163
1172
}
0 commit comments