@@ -92,7 +92,12 @@ read_table_cols(kastore_t *store, read_table_col_t *read_cols, size_t num_cols)
9292 * read_cols [j ].len_dest = (tsk_size_t ) - 1 ;
9393 }
9494 for (j = 0 ; j < num_cols ; j ++ ) {
95- if (kastore_containss (store , read_cols [j ].name )) {
95+ ret = kastore_containss (store , read_cols [j ].name );
96+ if (ret < 0 ) {
97+ ret = tsk_set_kas_error (ret );
98+ goto out ;
99+ }
100+ if (ret == 1 ) {
96101 ret = kastore_gets (
97102 store , read_cols [j ].name , read_cols [j ].array_dest , & len , & type );
98103 if (ret != 0 ) {
@@ -6681,6 +6686,12 @@ tsk_table_collection_print_state(tsk_table_collection_t *self, FILE *out)
66816686{
66826687 fprintf (out , "Table collection state\n" );
66836688 fprintf (out , "sequence_length = %f\n" , self -> sequence_length );
6689+ fprintf (out , "#metadata_schema#\n" );
6690+ fprintf (out , "%.*s\n" , self -> metadata_schema_length , self -> metadata_schema );
6691+ fprintf (out , "#end#metadata_schema\n" );
6692+ fprintf (out , "#metadata#\n" );
6693+ fprintf (out , "%.*s\n" , self -> metadata_length , self -> metadata );
6694+ fprintf (out , "#end#metadata\n" );
66846695 tsk_individual_table_print_state (& self -> individuals , out );
66856696 tsk_node_table_print_state (& self -> nodes , out );
66866697 tsk_edge_table_print_state (& self -> edges , out );
@@ -6747,6 +6758,8 @@ tsk_table_collection_free(tsk_table_collection_t *self)
67476758 tsk_safe_free (self -> indexes .edge_insertion_order );
67486759 tsk_safe_free (self -> indexes .edge_removal_order );
67496760 tsk_safe_free (self -> file_uuid );
6761+ tsk_safe_free (self -> metadata );
6762+ tsk_safe_free (self -> metadata_schema );
67506763 return 0 ;
67516764}
67526765
@@ -6758,6 +6771,14 @@ bool
67586771tsk_table_collection_equals (tsk_table_collection_t * self , tsk_table_collection_t * other )
67596772{
67606773 bool ret = self -> sequence_length == other -> sequence_length
6774+ && self -> metadata_length == other -> metadata_length
6775+ && self -> metadata_schema_length == other -> metadata_schema_length
6776+ && memcmp (self -> metadata , other -> metadata ,
6777+ self -> metadata_length * sizeof (char ))
6778+ == 0
6779+ && memcmp (self -> metadata_schema , other -> metadata_schema ,
6780+ self -> metadata_schema_length * sizeof (char ))
6781+ == 0
67616782 && tsk_individual_table_equals (& self -> individuals , & other -> individuals )
67626783 && tsk_node_table_equals (& self -> nodes , & other -> nodes )
67636784 && tsk_edge_table_equals (& self -> edges , & other -> edges )
@@ -6769,6 +6790,22 @@ tsk_table_collection_equals(tsk_table_collection_t *self, tsk_table_collection_t
67696790 return ret ;
67706791}
67716792
6793+ int
6794+ tsk_table_collection_set_metadata (
6795+ tsk_table_collection_t * self , const char * metadata , tsk_size_t metadata_length )
6796+ {
6797+ return replace_string (
6798+ & self -> metadata , & self -> metadata_length , metadata , metadata_length );
6799+ }
6800+
6801+ int
6802+ tsk_table_collection_set_metadata_schema (tsk_table_collection_t * self ,
6803+ const char * metadata_schema , tsk_size_t metadata_schema_length )
6804+ {
6805+ return replace_string (& self -> metadata_schema , & self -> metadata_schema_length ,
6806+ metadata_schema , metadata_schema_length );
6807+ }
6808+
67726809static int
67736810tsk_table_collection_set_index (tsk_table_collection_t * self ,
67746811 tsk_id_t * edge_insertion_order , tsk_id_t * edge_removal_order )
@@ -6922,6 +6959,16 @@ tsk_table_collection_copy(
69226959 goto out ;
69236960 }
69246961 }
6962+ ret = tsk_table_collection_set_metadata (dest , self -> metadata , self -> metadata_length );
6963+ if (ret != 0 ) {
6964+ goto out ;
6965+ }
6966+ ret = tsk_table_collection_set_metadata_schema (
6967+ dest , self -> metadata_schema , self -> metadata_schema_length );
6968+ if (ret != 0 ) {
6969+ goto out ;
6970+ }
6971+
69256972out :
69266973 return ret ;
69276974}
@@ -6935,6 +6982,10 @@ tsk_table_collection_read_format_data(tsk_table_collection_t *self, kastore_t *s
69356982 int8_t * format_name , * uuid ;
69366983 double * L ;
69376984
6985+ char * metadata = NULL ;
6986+ char * metadata_schema = NULL ;
6987+ size_t metadata_length , metadata_schema_length ;
6988+
69386989 ret = kastore_gets_int8 (store , "format/name" , & format_name , & len );
69396990 if (ret != 0 ) {
69406991 ret = tsk_set_kas_error (ret );
@@ -7000,6 +7051,45 @@ tsk_table_collection_read_format_data(tsk_table_collection_t *self, kastore_t *s
70007051 }
70017052 memcpy (self -> file_uuid , uuid , TSK_UUID_SIZE );
70027053 self -> file_uuid [TSK_UUID_SIZE ] = '\0' ;
7054+
7055+ ret = kastore_containss (store , "metadata" );
7056+ if (ret < 0 ) {
7057+ ret = tsk_set_kas_error (ret );
7058+ goto out ;
7059+ }
7060+ if (ret == 1 ) {
7061+ ret = kastore_gets_int8 (
7062+ store , "metadata" , (int8_t * * ) & metadata , (size_t * ) & metadata_length );
7063+ if (ret != 0 ) {
7064+ ret = tsk_set_kas_error (ret );
7065+ goto out ;
7066+ }
7067+ ret = tsk_table_collection_set_metadata (
7068+ self , metadata , (tsk_size_t ) metadata_length );
7069+ if (ret != 0 ) {
7070+ goto out ;
7071+ }
7072+ }
7073+
7074+ ret = kastore_containss (store , "metadata_schema" );
7075+ if (ret < 0 ) {
7076+ ret = tsk_set_kas_error (ret );
7077+ goto out ;
7078+ }
7079+ if (ret == 1 ) {
7080+ ret = kastore_gets_int8 (store , "metadata_schema" , (int8_t * * ) & metadata_schema ,
7081+ (size_t * ) & metadata_schema_length );
7082+ if (ret != 0 ) {
7083+ ret = tsk_set_kas_error (ret );
7084+ goto out ;
7085+ }
7086+ ret = tsk_table_collection_set_metadata_schema (
7087+ self , metadata_schema , (tsk_size_t ) metadata_schema_length );
7088+ if (ret != 0 ) {
7089+ goto out ;
7090+ }
7091+ }
7092+
70037093out :
70047094 if ((ret ^ (1 << TSK_KAS_ERR_BIT )) == KAS_ERR_KEY_NOT_FOUND ) {
70057095 ret = TSK_ERR_REQUIRED_COL_NOT_FOUND ;
@@ -7146,6 +7236,9 @@ tsk_table_collection_write_format_data(tsk_table_collection_t *self, kastore_t *
71467236 { "format/version" , (void * ) version , 2 , KAS_UINT32 },
71477237 { "sequence_length" , (void * ) & self -> sequence_length , 1 , KAS_FLOAT64 },
71487238 { "uuid" , (void * ) uuid , TSK_UUID_SIZE , KAS_INT8 },
7239+ { "metadata" , (void * ) self -> metadata , self -> metadata_length , KAS_INT8 },
7240+ { "metadata_schema" , (void * ) self -> metadata_schema ,
7241+ self -> metadata_schema_length , KAS_INT8 },
71497242 };
71507243
71517244 ret = tsk_generate_uuid (uuid , 0 );
0 commit comments