@@ -233,7 +233,15 @@ void SqliteStorage::open(
233
233
void SqliteStorage::update_metadata (const rosbag2_storage::BagMetadata & metadata)
234
234
{
235
235
metadata_ = metadata;
236
- // TODO(morlov:) update BagMetadata in DB
236
+ if (db_schema_version_ >= 3 ) { // We don't have metadata table before schema version 3
237
+ YAML::Node metadata_node = YAML::convert<rosbag2_storage::BagMetadata>::encode (metadata);
238
+ std::string serialized_metadata = YAML::Dump (metadata_node);
239
+
240
+ auto insert_metadata = database_->prepare_statement (
241
+ " INSERT INTO metadata (metadata_version, metadata) VALUES (?, ?)" );
242
+ insert_metadata->bind (metadata.version , serialized_metadata);
243
+ insert_metadata->execute_and_reset ();
244
+ }
237
245
}
238
246
239
247
void SqliteStorage::activate_transaction ()
@@ -631,9 +639,28 @@ uint64_t SqliteStorage::get_minimum_split_file_size() const
631
639
632
640
void SqliteStorage::read_metadata ()
633
641
{
634
- metadata_.storage_identifier = get_storage_identifier ();
635
- metadata_.relative_file_paths = {get_relative_file_path ()};
642
+ std::vector<rosbag2_storage::BagMetadata> metadata_from_table;
643
+ if (db_schema_version_ >= 3 ) {
644
+ auto statement = database_->prepare_statement (
645
+ " SELECT metadata_version, metadata FROM metadata ORDER BY id;" );
646
+ auto query_results = statement->execute_query <std::string, std::string>();
647
+
648
+ for (auto result : query_results) {
649
+ std::string serialized_metadata = std::get<1 >(result);
650
+ YAML::Node metadata_node = YAML::Load (serialized_metadata);
636
651
652
+ rosbag2_storage::BagMetadata current_metadata{};
653
+ YAML::convert<rosbag2_storage::BagMetadata>::decode (metadata_node, current_metadata);
654
+ metadata_from_table.push_back (current_metadata);
655
+ }
656
+ }
657
+ if (!metadata_from_table.empty ()) {
658
+ metadata_ = metadata_from_table.back (); // Take latest saved metadata
659
+ } else {
660
+ metadata_.storage_identifier = get_storage_identifier ();
661
+ metadata_.relative_file_paths = {get_relative_file_path ()};
662
+ }
663
+ // Update metadata according to the real data stored in file
637
664
metadata_.message_count = 0 ;
638
665
metadata_.topics_with_message_count = {};
639
666
0 commit comments