Skip to content

Commit 3fd28f0

Browse files
Store metadata in db3 file (ros2#1294)
- Implement update_metadata() in sqlite_storage.cpp to store metadata in database table. - Update read_metadata() to read metadata from database table. - New functionality covered by StorageTestFixture::get_metadata_returns_correct_struct test Signed-off-by: Michael Orlov <[email protected]>
1 parent a218e37 commit 3fd28f0

File tree

1 file changed

+30
-3
lines changed

1 file changed

+30
-3
lines changed

rosbag2_storage_sqlite3/src/rosbag2_storage_sqlite3/sqlite_storage.cpp

+30-3
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,15 @@ void SqliteStorage::open(
233233
void SqliteStorage::update_metadata(const rosbag2_storage::BagMetadata & metadata)
234234
{
235235
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+
}
237245
}
238246

239247
void SqliteStorage::activate_transaction()
@@ -631,9 +639,28 @@ uint64_t SqliteStorage::get_minimum_split_file_size() const
631639

632640
void SqliteStorage::read_metadata()
633641
{
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);
636651

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
637664
metadata_.message_count = 0;
638665
metadata_.topics_with_message_count = {};
639666

0 commit comments

Comments
 (0)