From 425425c15d7cec86163d5f847e6c2d877c1c25f5 Mon Sep 17 00:00:00 2001 From: Frank Ueberschar Date: Fri, 31 Jan 2020 12:02:12 +0100 Subject: [PATCH] dbcopy: update sequence at the end of each table copy --- .../dird/dbcopy/database_export_postgresql.cc | 26 ++++++++++++------- core/src/dird/dbcopy/database_import_mysql.cc | 2 +- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/core/src/dird/dbcopy/database_export_postgresql.cc b/core/src/dird/dbcopy/database_export_postgresql.cc index d5c3c111de1..ca3547360a6 100644 --- a/core/src/dird/dbcopy/database_export_postgresql.cc +++ b/core/src/dird/dbcopy/database_export_postgresql.cc @@ -107,35 +107,41 @@ void DatabaseExportPostgresql::CopyRow(RowData& source_data_row) } } -void DatabaseExportPostgresql::CopyStart() { SelectSequenceSchema(); } +void DatabaseExportPostgresql::CopyStart() +{ + // runs before first table + SelectSequenceSchema(); +} static void UpdateSequences( BareosDb* db, const DatabaseExportPostgresql::SequenceSchemaVector& - sequence_schema_vector) + sequence_schema_vector, + const std::string& table_name) { - std::cout << "Updating sequence for tables: " << std::endl; for (const auto& s : sequence_schema_vector) { - std::cout << "--> " << s.table_name << std::endl; + std::string table_name_lower_case; + std::transform(table_name.cbegin(), table_name.cend(), + std::back_inserter(table_name_lower_case), ::tolower); + if (s.table_name == table_name_lower_case) { std::string sequence_schema_query{"select setval(' "}; sequence_schema_query += s.sequence_name; sequence_schema_query += "', (select max("; sequence_schema_query += s.column_name; sequence_schema_query += ") from "; - sequence_schema_query += s.table_name; + sequence_schema_query += table_name_lower_case; sequence_schema_query += "))"; + std::cout << "--> updating sequence" << std::endl; if (!db->SqlQuery(sequence_schema_query.c_str())) { throw std::runtime_error( "DatabaseExportPostgresql: Could not set sequence"); } } } - -void DatabaseExportPostgresql::CopyEnd() -{ - UpdateSequences(db_, sequence_schema_vector_); } +void DatabaseExportPostgresql::CopyEnd() {} + void DatabaseExportPostgresql::CursorStartTable(const std::string& table_name) { const DatabaseTableDescriptions::TableDescription* table{ @@ -224,6 +230,8 @@ void DatabaseExportPostgresql::EndTable(const std::string& table_name) } } + UpdateSequences(db_, sequence_schema_vector_, table_name); + if (transaction_) { db_->SqlQuery("COMMIT"); transaction_ = false; diff --git a/core/src/dird/dbcopy/database_import_mysql.cc b/core/src/dird/dbcopy/database_import_mysql.cc index 7d91b939fe6..f410bddaa6d 100644 --- a/core/src/dird/dbcopy/database_import_mysql.cc +++ b/core/src/dird/dbcopy/database_import_mysql.cc @@ -198,7 +198,7 @@ void DatabaseImportMysql::FillRowWithDatabaseResult(ResultHandlerContext* r, "Number of database fields does not match description"); } - RowData& row_data = r->row_data; + RowData& row_data = r->row_data; if (r->is_restore_object) { std::size_t field_index_longblob = fields - 1;