From 06af7d794f9493fc41bbcb338d0130ea8339ab3c Mon Sep 17 00:00:00 2001 From: John Ralls Date: Mon, 28 Nov 2016 10:24:35 -0800 Subject: [PATCH] Remove need for gnc_dbi_safe_sync_all to be a friend of GncDbiSqlConnection. Adds GncDbiSqlConnection::drop_indexes, changes GncDbiSqlConnection::table_operation to use a regex-filtered table list from the DbiConn, and converts TableOpType to a C++ enum. --- src/backend/dbi/gnc-backend-dbi.cpp | 29 +++++++-------- src/backend/dbi/gnc-backend-dbi.hpp | 4 +-- src/backend/dbi/gnc-dbisqlconnection.cpp | 45 ++++++++++++++++++------ src/backend/dbi/gnc-dbisqlconnection.hpp | 6 ++-- 4 files changed, 51 insertions(+), 33 deletions(-) diff --git a/src/backend/dbi/gnc-backend-dbi.cpp b/src/backend/dbi/gnc-backend-dbi.cpp index 8c00ec5d62..cbd251effe 100644 --- a/src/backend/dbi/gnc-backend-dbi.cpp +++ b/src/backend/dbi/gnc-backend-dbi.cpp @@ -907,25 +907,20 @@ gnc_dbi_safe_sync_all (QofBackend* qof_be, QofBook* book) g_return_if_fail (dbi_be != nullptr); g_return_if_fail (book != nullptr); - ENTER ("book=%p, primary=%p", book, dbi_be->m_book); - auto table_list = conn->m_provider->get_table_list (conn->conn(), ""); - if (!conn->table_operation (table_list, backup)) + ENTER ("book=%p, primary=%p", book, m_book); + if (!conn->table_operation (TableOpType::backup)) { - qof_backend_set_error (qof_be, ERR_BACKEND_SERVER_ERR); - conn->table_operation (table_list, rollback); + set_error(ERR_BACKEND_SERVER_ERR); + conn->table_operation (TableOpType::rollback); LEAVE ("Failed to rename tables"); return; } - auto index_list = conn->m_provider->get_index_list (conn->m_conn); - for (auto index : index_list) + if (!conn->drop_indexes()) { - const char* errmsg; - conn->m_provider->drop_index (conn->m_conn, index); - if (DBI_ERROR_NONE != dbi_conn_error (conn->m_conn, &errmsg)) - { - qof_backend_set_error (qof_be, ERR_BACKEND_SERVER_ERR); - conn->table_operation (table_list, rollback); - LEAVE ("Failed to drop indexes %s", errmsg); + conn->table_operation (TableOpType::rollback); + set_error (ERR_BACKEND_SERVER_ERR); + set_message("Failed to drop indexes"); + LEAVE ("Failed to drop indexes"); return; } } @@ -933,12 +928,12 @@ gnc_dbi_safe_sync_all (QofBackend* qof_be, QofBook* book) dbi_be->sync_all(book); if (qof_backend_check_error (qof_be)) { - conn->table_operation (table_list, rollback); + conn->table_operation (TableOpType::rollback); LEAVE ("Failed to create new database tables"); return; } - conn->table_operation (table_list, drop_backup); - LEAVE ("book=%p", book); + conn->table_operation (TableOpType::drop_backup); + LEAVE ("book=%p", m_book); } /* ================================================================= */ static void diff --git a/src/backend/dbi/gnc-backend-dbi.hpp b/src/backend/dbi/gnc-backend-dbi.hpp index 0a571d1649..796c825552 100644 --- a/src/backend/dbi/gnc-backend-dbi.hpp +++ b/src/backend/dbi/gnc-backend-dbi.hpp @@ -49,14 +49,14 @@ class GncSqlRow; * @var rollback drop the name table if it exists and rename name_back to name * @var drop_backup Drop the backup table */ -typedef enum +enum TableOpType { drop = 0, empty, backup, rollback, drop_backup -} TableOpType; +}; /** * Return values from conn_test_dbi_library diff --git a/src/backend/dbi/gnc-dbisqlconnection.cpp b/src/backend/dbi/gnc-dbisqlconnection.cpp index 8731bdb976..e39dc8f4d0 100644 --- a/src/backend/dbi/gnc-dbisqlconnection.cpp +++ b/src/backend/dbi/gnc-dbisqlconnection.cpp @@ -28,6 +28,10 @@ extern "C" #include #include } + +#include +#include + #include "gnc-dbisqlconnection.hpp" static QofLogModule log_module = G_LOG_DOMAIN; @@ -586,16 +590,16 @@ GncDbiSqlConnection::table_manage_backup (const std::string& table_name, dbi_result result = nullptr; switch (op) { - case backup: + case TableOpType::backup: result = dbi_conn_queryf (m_conn, "ALTER TABLE %s RENAME TO %s", table_name.c_str(), new_name.c_str()); break; - case rollback: + case TableOpType::rollback: result = dbi_conn_queryf (m_conn, "ALTER TABLE %s RENAME TO %s", new_name.c_str(), table_name.c_str()); break; - case drop_backup: + case TableOpType::drop_backup: result = dbi_conn_queryf (m_conn, "DROP TABLE %s", new_name.c_str()); break; @@ -630,16 +634,20 @@ GncDbiSqlConnection::table_manage_backup (const std::string& table_name, */ bool -GncDbiSqlConnection::table_operation(const StrVec& table_names, - TableOpType op) noexcept +GncDbiSqlConnection::table_operation(TableOpType op) noexcept { - g_return_val_if_fail (!table_names.empty(), FALSE); + static const std::regex backupre (".*_back"); bool retval{true}; - for (auto table : table_names) + for (auto table : m_provider->get_table_list(m_conn, "")) { dbi_result result; - /* Ignore the lock table */ - if (table == lock_table) + /* Skip the lock table and existing backup tables; the former we don't + * want to touch, the latter are handled by table_manage_backup. It + * would be nicer to handle this with the get_table_list query, but that + * can accept only SQL LIKE patterns (not even regexps) and there's no + * way to have a negative one. + */ + if (table == lock_table || std::regex_match(table, backupre)) { continue; } @@ -660,7 +668,7 @@ GncDbiSqlConnection::table_operation(const StrVec& table_names, break; } } - /* Fall through */ + /* Fall through to rename the _back tables back.*/ case backup: case drop_backup: result = table_manage_backup (table, op); @@ -689,6 +697,23 @@ GncDbiSqlConnection::table_operation(const StrVec& table_names, return retval; } +bool +GncDbiSqlConnection::drop_indexes() noexcept +{ + auto index_list = m_provider->get_index_list (m_conn); + for (auto index : index_list) + { + const char* errmsg; + m_provider->drop_index (m_conn, index); + if (DBI_ERROR_NONE != dbi_conn_error (m_conn, &errmsg)) + { + PERR("Failed to drop indexes %s", errmsg); + return false; + } + } + return true; +} + std::string GncDbiSqlConnection::add_columns_ddl(const std::string& table_name, const ColVec& info_vec) const noexcept diff --git a/src/backend/dbi/gnc-dbisqlconnection.hpp b/src/backend/dbi/gnc-dbisqlconnection.hpp index 466e5d97ae..05973c8779 100644 --- a/src/backend/dbi/gnc-dbisqlconnection.hpp +++ b/src/backend/dbi/gnc-dbisqlconnection.hpp @@ -81,12 +81,10 @@ public: bool verify() noexcept override; bool retry_connection(const char* msg) noexcept override; dbi_result table_manage_backup(const std::string& table_name, TableOpType op); - bool table_operation (const StrVec& table_name_list, - TableOpType op) noexcept; + bool table_operation (TableOpType op) noexcept; std::string add_columns_ddl(const std::string& table_name, const ColVec& info_vec) const noexcept; - friend void gnc_dbi_safe_sync_all (QofBackend* qbe, QofBook* book); - + bool drop_indexes() noexcept; private: QofBackend* m_qbe; dbi_conn m_conn;