gnucash maint: Multiple changes pushed

John Ralls jralls at code.gnucash.org
Sat Jun 2 19:32:44 EDT 2018


Updated	 via  https://github.com/Gnucash/gnucash/commit/3b3074c2 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/f8045b27 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/537fd995 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/9db60ca6 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/3e052e8d (commit)
	 via  https://github.com/Gnucash/gnucash/commit/e23769f0 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/f504e39d (commit)
	 via  https://github.com/Gnucash/gnucash/commit/464fdeeb (commit)
	from  https://github.com/Gnucash/gnucash/commit/74cbde2d (commit)



commit 3b3074c28d39ab5cfae93261978cad17ed3dc73e
Author: John Ralls <jralls at ceridwen.us>
Date:   Sat Jun 2 16:21:49 2018 -0700

    Bug 796117 - Connecting 3.1 to an existing mysql db drops all data
    
    Provide a backup recovery function that instead of dropping primaries
    and restoring backups merges the primaries and backups. This should
    handle a worst-case safe-save failure where the backup tables don't
    have a complete set of rows for some reason.

diff --git a/libgnucash/backend/dbi/gnc-backend-dbi.hpp b/libgnucash/backend/dbi/gnc-backend-dbi.hpp
index d75a373..cdcfdf9 100644
--- a/libgnucash/backend/dbi/gnc-backend-dbi.hpp
+++ b/libgnucash/backend/dbi/gnc-backend-dbi.hpp
@@ -53,7 +53,8 @@ enum TableOpType
 {
     backup = 0,
     rollback,
-    drop_backup
+    drop_backup,
+    recover
 };
 
 /**
diff --git a/libgnucash/backend/dbi/gnc-dbisqlconnection.cpp b/libgnucash/backend/dbi/gnc-dbisqlconnection.cpp
index f1e361d..ac25fb5 100644
--- a/libgnucash/backend/dbi/gnc-dbisqlconnection.cpp
+++ b/libgnucash/backend/dbi/gnc-dbisqlconnection.cpp
@@ -232,7 +232,16 @@ GncDbiSqlConnection::check_and_rollback_failed_save()
     auto backup_tables = m_provider->get_table_list(m_conn, "%back");
     if (backup_tables.empty())
         return true;
-    return table_operation(rollback);
+    auto merge_tables{m_provider->get_table_list(m_conn, "%_merge")};
+    if (!merge_tables.empty())
+    {
+        PERR("Merge tables exist in the database indicating a previous"
+             "attempt to recover from a failed safe-save. Automatic"
+             "recovery is beyond GnuCash's ability, you must recover"
+             "by hand or restore from a good backup.");
+        return false;
+    }
+    return table_operation(recover);
 }
 
 GncDbiSqlConnection::~GncDbiSqlConnection()
@@ -610,6 +619,23 @@ GncDbiSqlConnection::drop_table(const std::string& table)
     return execute_nonselect_statement(stmt) >= 0;
 }
 
+bool
+GncDbiSqlConnection::merge_tables(const std::string& table,
+                                  const std::string& other)
+{
+    auto merge_table = table + "_merge";
+    std::string sql = "CREATE TABLE " + merge_table + " AS SELECT * FROM " +
+        table + " UNION SELECT * FROM " + other;
+    auto stmt = create_statement_from_sql(sql);
+    if (execute_nonselect_statement(stmt) < 0)
+        return false;
+    if (!drop_table(table))
+        return false;
+    if (!rename_table(merge_table, table))
+        return false;
+    return drop_table(other);
+}
+
 /**
  * Perform a specified SQL operation on every table in a
  * database. Possible operations are:
@@ -662,15 +688,15 @@ GncDbiSqlConnection::table_operation(TableOpType op) noexcept
                 return false; /* Error, trigger rollback. */
         break;
     case drop_backup:
-            for (auto table : backup_tables)
-            {
-                auto data_table = table.substr(0, table.find("_back"));
-                if (std::find(data_tables.begin(), data_tables.end(),
-                             data_table) != data_tables.end())
-                    drop_table(table); /* Other table exists, OK. */
-                else /* No data table, restore the backup */
-                    rename_table(table, data_table);
-            }
+        for (auto table : backup_tables)
+        {
+            auto data_table = table.substr(0, table.find("_back"));
+            if (std::find(data_tables.begin(), data_tables.end(),
+                          data_table) != data_tables.end())
+                drop_table(table); /* Other table exists, OK. */
+            else /* No data table, restore the backup */
+                rename_table(table, data_table);
+        }
         break;
     case rollback:
         for (auto table : backup_tables)
@@ -682,6 +708,23 @@ GncDbiSqlConnection::table_operation(TableOpType op) noexcept
             rename_table(table, data_table);
         }
         break;
+    case recover:
+        for (auto table : backup_tables)
+        {
+            auto data_table = table.substr(0, table.find("_back"));
+            if (std::find(data_tables.begin(), data_tables.end(),
+                          data_table) != data_tables.end())
+            {
+                if (!merge_tables(data_table, table))
+                    return false;
+            }
+            else
+            {
+                if (!rename_table(table, data_table))
+                    return false;
+            }
+        }
+        break;
     }
    return true;
 }
diff --git a/libgnucash/backend/dbi/gnc-dbisqlconnection.hpp b/libgnucash/backend/dbi/gnc-dbisqlconnection.hpp
index e2ae49d..56766e1 100644
--- a/libgnucash/backend/dbi/gnc-dbisqlconnection.hpp
+++ b/libgnucash/backend/dbi/gnc-dbisqlconnection.hpp
@@ -112,6 +112,7 @@ private:
     void unlock_database();
     bool rename_table(const std::string& old_name, const std::string& new_name);
     bool drop_table(const std::string& table);
+    bool merge_tables(const std::string& table, const std::string& other);
     bool check_and_rollback_failed_save();
 };
 

commit f8045b27355e105e6c4513ac2c3cdeab9f91bb9d
Author: John Ralls <jralls at ceridwen.us>
Date:   Sat Jun 2 16:21:05 2018 -0700

    A wee bit of C++ style.

diff --git a/libgnucash/backend/sql/gnc-slots-sql.cpp b/libgnucash/backend/sql/gnc-slots-sql.cpp
index 980439f..d0a5145 100644
--- a/libgnucash/backend/sql/gnc-slots-sql.cpp
+++ b/libgnucash/backend/sql/gnc-slots-sql.cpp
@@ -363,11 +363,9 @@ set_string_val (gpointer pObject,  gpointer pValue)
 static  gpointer
 get_double_val (gpointer pObject)
 {
-    slot_info_t* pInfo = (slot_info_t*)pObject;
-    static double d_val;
-
+    static double d_val; /* static so that we can return it. */
     g_return_val_if_fail (pObject != NULL, NULL);
-
+    auto pInfo = static_cast<slot_info_t*>(pObject);
     if (pInfo->pKvpValue->get_type () == KvpValue::Type::DOUBLE)
     {
         d_val = pInfo->pKvpValue->get<double> ();

commit 537fd995a3221db3ca5ec785a3247851b5464c40
Author: John Ralls <jralls at ceridwen.us>
Date:   Sat Jun 2 16:20:36 2018 -0700

    Ensure full precision of doubles is saved to SQL.
    
    std::iostream's operator<<(double) uses only 6 digits of precision
    by default. We want 12 digits when saving.

diff --git a/libgnucash/backend/sql/gnc-sql-column-table-entry.hpp b/libgnucash/backend/sql/gnc-sql-column-table-entry.hpp
index 0465589..9e3809b 100644
--- a/libgnucash/backend/sql/gnc-sql-column-table-entry.hpp
+++ b/libgnucash/backend/sql/gnc-sql-column-table-entry.hpp
@@ -31,6 +31,8 @@ extern "C"
 #include <memory>
 #include <vector>
 #include <iostream>
+#include <iomanip>
+
 #include "gnc-sql-result.hpp"
 
 struct GncSqlColumnInfo;
@@ -384,6 +386,22 @@ GncSqlColumnTableEntry::add_value_to_vec(QofIdTypeConst obj_name,
     }
 }
 
+template <> inline  void
+GncSqlColumnTableEntry::add_value_to_vec<double*>(QofIdTypeConst obj_name,
+                                         const void* pObject,
+                                         PairVec& vec, std::true_type) const
+{
+    double* s = get_row_value_from_object<double*>(obj_name, pObject);
+
+    if (s != nullptr)
+    {
+        std::ostringstream stream;
+        stream << std::setprecision(12) << std::fixed << *s;
+        vec.emplace_back(std::make_pair(std::string{m_col_name}, stream.str()));
+        return;
+    }
+}
+
 template <typename T> void
 GncSqlColumnTableEntry::add_value_to_vec(QofIdTypeConst obj_name,
                                          const void* pObject,
@@ -397,6 +415,19 @@ GncSqlColumnTableEntry::add_value_to_vec(QofIdTypeConst obj_name,
     return;
 }
 
+template <> inline void
+GncSqlColumnTableEntry::add_value_to_vec<double>(QofIdTypeConst obj_name,
+                                         const void* pObject,
+                                         PairVec& vec, std::false_type) const
+{
+    double s = *get_row_value_from_object<double*>(obj_name, pObject);
+
+    std::ostringstream stream;
+    stream << std::setprecision(12) << std::fixed << s;
+    vec.emplace_back(std::make_pair(std::string{m_col_name}, stream.str()));
+    return;
+}
+
 /**
  * Load an arbitrary object from a result row.
  *

commit 9db60ca63c12eca99c6ea893b22617e934b8943b
Author: John Ralls <jralls at ceridwen.us>
Date:   Sat Jun 2 16:16:41 2018 -0700

    Make float database operations more consistent.
    
    We don't use floats in GnuCash, we use doubles (and those as little as
    possible), but dbd-sqlite3 is broken in that it stores only floats.
    Simply casting floats to doubles introduces bogus additional digits
    that can cause round-trip tests to fail. Instead convert floats to
    doubles by multiplying by 10E6, rounding, then dividing by 10E6.

diff --git a/libgnucash/backend/dbi/gnc-dbisqlresult.cpp b/libgnucash/backend/dbi/gnc-dbisqlresult.cpp
index 5b2a784..334061a 100644
--- a/libgnucash/backend/dbi/gnc-dbisqlresult.cpp
+++ b/libgnucash/backend/dbi/gnc-dbisqlresult.cpp
@@ -30,6 +30,7 @@ extern "C"
 /* For direct access to dbi data structs, sadly needed for datetime */
 #include <dbi/dbi-dev.h>
 }
+#include <cmath>
 #include <gnc-datetime.hpp>
 #include "gnc-dbisqlresult.hpp"
 #include "gnc-dbisqlconnection.hpp"
@@ -109,7 +110,7 @@ GncDbiSqlResult::IteratorImpl::get_int_at_col(const char* col) const
     return dbi_result_get_longlong (m_inst->m_dbi_result, col);
 }
 
-float
+double
 GncDbiSqlResult::IteratorImpl::get_float_at_col(const char* col) const
 {
     auto type = dbi_result_get_field_type (m_inst->m_dbi_result, col);
@@ -118,8 +119,9 @@ GncDbiSqlResult::IteratorImpl::get_float_at_col(const char* col) const
        (attrs & DBI_DECIMAL_SIZEMASK) != DBI_DECIMAL_SIZE4)
         throw (std::invalid_argument{"Requested float from non-float column."});
     auto locale = gnc_push_locale (LC_NUMERIC, "C");
-    auto retval =  dbi_result_get_float(m_inst->m_dbi_result, col);
+    auto interim =  dbi_result_get_float(m_inst->m_dbi_result, col);
     gnc_pop_locale (LC_NUMERIC, locale);
+    double retval = static_cast<double>(round(interim * 1000000.0)) / 1000000.0;
     return retval;
 }
 
diff --git a/libgnucash/backend/dbi/gnc-dbisqlresult.hpp b/libgnucash/backend/dbi/gnc-dbisqlresult.hpp
index faf5143..c0dd59e 100644
--- a/libgnucash/backend/dbi/gnc-dbisqlresult.hpp
+++ b/libgnucash/backend/dbi/gnc-dbisqlresult.hpp
@@ -54,7 +54,7 @@ protected:
         virtual GncSqlRow& operator++(int) { return ++(*this); };
         virtual GncSqlResult* operator*() { return m_inst; }
         virtual int64_t get_int_at_col (const char* col) const;
-        virtual float get_float_at_col (const char* col) const;
+        virtual double get_float_at_col (const char* col) const;
         virtual double get_double_at_col (const char* col) const;
         virtual std::string get_string_at_col (const char* col)const;
         virtual time64 get_time64_at_col (const char* col) const;
diff --git a/libgnucash/backend/sql/gnc-sql-column-table-entry.cpp b/libgnucash/backend/sql/gnc-sql-column-table-entry.cpp
index 7a38b82..cba8d17 100644
--- a/libgnucash/backend/sql/gnc-sql-column-table-entry.cpp
+++ b/libgnucash/backend/sql/gnc-sql-column-table-entry.cpp
@@ -283,7 +283,7 @@ GncSqlColumnTableEntryImpl<CT_DOUBLE>::load (const GncSqlBackend* sql_be,
     {
         try
         {
-            val = static_cast<double>(row.get_float_at_col(m_col_name));
+            val = row.get_float_at_col(m_col_name);
         }
         catch (std::invalid_argument&)
         {
diff --git a/libgnucash/backend/sql/gnc-sql-result.hpp b/libgnucash/backend/sql/gnc-sql-result.hpp
index 818df82..3c5c558 100644
--- a/libgnucash/backend/sql/gnc-sql-result.hpp
+++ b/libgnucash/backend/sql/gnc-sql-result.hpp
@@ -52,7 +52,7 @@ protected:
         virtual GncSqlRow& operator++() = 0;
         virtual GncSqlResult* operator*() = 0;
         virtual int64_t get_int_at_col (const char* col) const = 0;
-        virtual float get_float_at_col (const char* col) const = 0;
+        virtual double get_float_at_col (const char* col) const = 0;
         virtual double get_double_at_col (const char* col) const = 0;
         virtual std::string get_string_at_col (const char* col) const = 0;
         virtual time64 get_time64_at_col (const char* col) const = 0;
@@ -88,7 +88,7 @@ public:
     friend bool operator!=(const GncSqlRow&, const GncSqlRow&);
     int64_t get_int_at_col (const char* col) const {
         return m_iter->get_int_at_col (col); }
-    float get_float_at_col (const char* col) const {
+    double get_float_at_col (const char* col) const {
         return m_iter->get_float_at_col (col); }
     double get_double_at_col (const char* col) const {
         return m_iter->get_double_at_col (col); }
diff --git a/libgnucash/backend/sql/test/utest-gnc-backend-sql.cpp b/libgnucash/backend/sql/test/utest-gnc-backend-sql.cpp
index b0b9ced..a990385 100644
--- a/libgnucash/backend/sql/test/utest-gnc-backend-sql.cpp
+++ b/libgnucash/backend/sql/test/utest-gnc-backend-sql.cpp
@@ -66,7 +66,7 @@ protected:
             virtual GncSqlResult* operator*() { return m_inst; }
             virtual int64_t get_int_at_col (const char* col) const
             { return 1LL; }
-            virtual float get_float_at_col (const char* col) const
+            virtual double get_float_at_col (const char* col) const
             { return 1.0; }
             virtual double get_double_at_col (const char* col) const
             { return 1.0; }

commit 3e052e8dac87b8b38af73bf68e5cdd03c56930f2
Author: John Ralls <jralls at ceridwen.us>
Date:   Fri Jun 1 14:12:56 2018 -0700

    [DBI Backend] Rework backup-table management.
    
    Removes a public function, GncDbiSqlConnection::table_manage_backup that
    should have been private in the first place.
    
    Better encapsulates table renames and drops with private functions and
    handles cases where there exist some primary tables and some backup tables.

diff --git a/libgnucash/backend/dbi/gnc-dbisqlconnection.cpp b/libgnucash/backend/dbi/gnc-dbisqlconnection.cpp
index 5abeef2..f1e361d 100644
--- a/libgnucash/backend/dbi/gnc-dbisqlconnection.cpp
+++ b/libgnucash/backend/dbi/gnc-dbisqlconnection.cpp
@@ -588,38 +588,28 @@ GncDbiSqlConnection::retry_connection(const char* msg)
 
     }
     PERR ("DBI error: %s - Giving up after %d consecutive attempts.\n", msg,
-                DBI_MAX_CONN_ATTEMPTS);
+          DBI_MAX_CONN_ATTEMPTS);
     m_conn_ok = false;
     return false;
 }
 
+bool
+GncDbiSqlConnection::rename_table(const std::string& old_name,
+                                  const std::string& new_name)
+{
+    std::string sql = "ALTER TABLE " + old_name + " RENAME TO " + new_name;
+    auto stmt = create_statement_from_sql(sql);
+    return execute_nonselect_statement(stmt) >= 0;
+}
 
-dbi_result
-GncDbiSqlConnection::table_manage_backup (const std::string& table_name,
-                                          TableOpType op)
+bool
+GncDbiSqlConnection::drop_table(const std::string& table)
 {
-    auto new_name = table_name + "_back";
-    dbi_result result = nullptr;
-    switch (op)
-    {
-    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 TableOpType::rollback:
-        result = dbi_conn_queryf (m_conn,
-                                  "ALTER TABLE %s RENAME TO %s",
-                                  new_name.c_str(), table_name.c_str());
-        break;
-    case TableOpType::drop_backup:
-        result = dbi_conn_queryf (m_conn, "DROP TABLE %s",
-                                  new_name.c_str());
-        break;
-    default:
-        break;
-    }
-    return result;
+    std::string sql = "DROP TABLE " + table;
+    auto stmt = create_statement_from_sql(sql);
+    return execute_nonselect_statement(stmt) >= 0;
 }
+
 /**
  * Perform a specified SQL operation on every table in a
  * database. Possible operations are:
@@ -648,58 +638,52 @@ GncDbiSqlConnection::table_manage_backup (const std::string& table_name,
 bool
 GncDbiSqlConnection::table_operation(TableOpType op) noexcept
 {
-    static const std::regex backupre (".*_back");
-    bool retval{true};
-    for (auto table : m_provider->get_table_list(m_conn, ""))
-    {
-        dbi_result result;
-        /* 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))
+    auto backup_tables{m_provider->get_table_list(m_conn, "%_back")};
+    auto all_tables{m_provider->get_table_list(m_conn, "")};
+    /* No operations on the lock table */
+    auto new_end = std::remove(all_tables.begin(), all_tables.end(), lock_table);
+    all_tables.erase(new_end, all_tables.end());
+    StrVec data_tables;
+    data_tables.reserve(all_tables.size() - backup_tables.size());
+    std::set_difference(all_tables.begin(), all_tables.end(),
+                        backup_tables.begin(), backup_tables.end(),
+                        std::back_inserter(data_tables));
+    switch(op)
+    {
+    case backup:
+        if (!backup_tables.empty())
         {
-            continue;
+            PERR("Unable to backup database, an existing backup is present.");
+            qof_backend_set_error(m_qbe, ERR_BACKEND_DATA_CORRUPT);
+            return false;
         }
-        do
-        {
-            init_error();
-            switch (op)
-            {
-            case rollback:
+        for (auto table : data_tables)
+            if (!rename_table(table, table +"_back"))
+                return false; /* Error, trigger rollback. */
+        break;
+    case drop_backup:
+            for (auto table : backup_tables)
             {
-                auto all_tables = m_provider->get_table_list(m_conn, "");
-                if (std::find(all_tables.begin(),
-                              all_tables.end(), table) != all_tables.end())
-                {
-                    result = dbi_conn_queryf (m_conn, "DROP TABLE %s",
-                                              table.c_str());
-                    if (result)
-                        break;
-                }
-            }
-            /* Fall through to rename the _back tables back.*/
-            case backup:
-            case drop_backup:
-                result = table_manage_backup (table, op);
-                break;
-                break;
+                auto data_table = table.substr(0, table.find("_back"));
+                if (std::find(data_tables.begin(), data_tables.end(),
+                             data_table) != data_tables.end())
+                    drop_table(table); /* Other table exists, OK. */
+                else /* No data table, restore the backup */
+                    rename_table(table, data_table);
             }
-        }
-        while (m_retry);
-
-        if (result != nullptr)
+        break;
+    case rollback:
+        for (auto table : backup_tables)
         {
-            if (dbi_result_free (result) < 0)
-            {
-                PERR ("Error in dbi_result_free() result\n");
-                retval = false;
-            }
+            auto data_table = table.substr(0, table.find("_back"));
+            if (std::find(data_tables.begin(), data_tables.end(),
+                          data_table) != data_tables.end())
+                drop_table(data_table); /* Other table exists, OK. */
+            rename_table(table, data_table);
         }
+        break;
     }
-    return retval;
+   return true;
 }
 
 bool
diff --git a/libgnucash/backend/dbi/gnc-dbisqlconnection.hpp b/libgnucash/backend/dbi/gnc-dbisqlconnection.hpp
index a72e53b..e2ae49d 100644
--- a/libgnucash/backend/dbi/gnc-dbisqlconnection.hpp
+++ b/libgnucash/backend/dbi/gnc-dbisqlconnection.hpp
@@ -80,7 +80,7 @@ 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 (TableOpType op) noexcept;
     std::string add_columns_ddl(const std::string& table_name,
                                 const ColVec& info_vec) const noexcept;
@@ -110,8 +110,9 @@ private:
     unsigned int m_sql_savepoint;
     bool lock_database(bool ignore_lock);
     void unlock_database();
+    bool rename_table(const std::string& old_name, const std::string& new_name);
+    bool drop_table(const std::string& table);
     bool check_and_rollback_failed_save();
-
 };
 
 #endif //_GNC_DBISQLCONNECTION_HPP_

commit e23769f078041ac9be787f85aa83723c15c18045
Author: John Ralls <jralls at ceridwen.us>
Date:   Fri Jun 1 14:02:29 2018 -0700

    [DBI Backend] If there's a set error value use that to set the backend error.

diff --git a/libgnucash/backend/dbi/gnc-dbisqlconnection.cpp b/libgnucash/backend/dbi/gnc-dbisqlconnection.cpp
index 43415e9..5abeef2 100644
--- a/libgnucash/backend/dbi/gnc-dbisqlconnection.cpp
+++ b/libgnucash/backend/dbi/gnc-dbisqlconnection.cpp
@@ -260,7 +260,13 @@ GncDbiSqlConnection::execute_select_statement (const GncSqlStatementPtr& stmt)
     }
     while (m_retry);
     if (result == nullptr)
+    {
         PERR ("Error executing SQL %s\n", stmt->to_sql());
+        if(m_last_error)
+            m_qbe->set_error(m_last_error);
+        else
+            m_qbe->set_error(ERR_BACKEND_SERVER_ERR);
+    }
     gnc_pop_locale (LC_NUMERIC, locale);
     return GncSqlResultPtr(new GncDbiSqlResult (this, result));
 }
@@ -281,6 +287,10 @@ GncDbiSqlConnection::execute_nonselect_statement (const GncSqlStatementPtr& stmt
     if (result == nullptr && m_last_error)
     {
         PERR ("Error executing SQL %s\n", stmt->to_sql());
+        if(m_last_error)
+            m_qbe->set_error(m_last_error);
+        else
+            m_qbe->set_error(ERR_BACKEND_SERVER_ERR);
         return -1;
     }
     if (!result)
@@ -290,7 +300,10 @@ GncDbiSqlConnection::execute_nonselect_statement (const GncSqlStatementPtr& stmt
     if (status < 0)
     {
         PERR ("Error in dbi_result_free() result\n");
-        qof_backend_set_error (m_qbe, ERR_BACKEND_SERVER_ERR);
+        if(m_last_error)
+            m_qbe->set_error(m_last_error);
+        else
+            m_qbe->set_error(ERR_BACKEND_SERVER_ERR);
     }
     return num_rows;
 }

commit f504e39d7818f0f8e74b00aeb838366540afd931
Author: John Ralls <jralls at ceridwen.us>
Date:   Fri Jun 1 14:00:52 2018 -0700

    Correct the type of error variables.
    
    C++ doesn't like interchanging enums and ints.

diff --git a/libgnucash/backend/dbi/gnc-backend-dbi.hpp b/libgnucash/backend/dbi/gnc-backend-dbi.hpp
index d31bab9..d75a373 100644
--- a/libgnucash/backend/dbi/gnc-backend-dbi.hpp
+++ b/libgnucash/backend/dbi/gnc-backend-dbi.hpp
@@ -97,7 +97,8 @@ public:
     void safe_sync(QofBook*) override;
     bool connected() const noexcept { return m_conn != nullptr; }
     /** FIXME: Just a pass-through to m_conn: */
-    void set_dbi_error(int error, unsigned int repeat,  bool retry) noexcept
+    void set_dbi_error(QofBackendError error, unsigned int repeat,
+                       bool retry) noexcept
     {
         m_conn->set_error(error, repeat, retry);
     }
diff --git a/libgnucash/backend/dbi/gnc-dbisqlconnection.hpp b/libgnucash/backend/dbi/gnc-dbisqlconnection.hpp
index c878cfd..a72e53b 100644
--- a/libgnucash/backend/dbi/gnc-dbisqlconnection.hpp
+++ b/libgnucash/backend/dbi/gnc-dbisqlconnection.hpp
@@ -64,7 +64,7 @@ public:
         return dbi_conn_error(m_conn, nullptr); }
     QofBackend* qbe () const noexcept { return m_qbe; }
     dbi_conn conn() const noexcept { return m_conn; }
-    inline void set_error(int error, unsigned int repeat,
+    inline void set_error(QofBackendError error, unsigned int repeat,
                           bool retry) noexcept override
     {
         m_last_error = error;
@@ -96,7 +96,7 @@ private:
     /** Code of the last error that occurred. This is set in the error callback
      * function.
      */
-    int m_last_error;
+    QofBackendError m_last_error;
     /** Used in case of transient errors. After such error, another attempt at
      * the original call is allowed. error_repeat tracks the number of attempts
      * and can be used to prevent infinite loops.
diff --git a/libgnucash/backend/sql/gnc-sql-connection.hpp b/libgnucash/backend/sql/gnc-sql-connection.hpp
index 1705b9e..eeef886 100644
--- a/libgnucash/backend/sql/gnc-sql-connection.hpp
+++ b/libgnucash/backend/sql/gnc-sql-connection.hpp
@@ -93,7 +93,8 @@ public:
      * If not 0 will normally be meaningless outside of implementation code.
      */
     virtual int dberror() const noexcept = 0;
-    virtual void set_error(int error, unsigned int repeat,  bool retry) noexcept = 0;
+    virtual void set_error(QofBackendError error, unsigned int repeat,
+                           bool retry) noexcept = 0;
     virtual bool verify() noexcept = 0;
     virtual bool retry_connection(const char* msg) noexcept = 0;
 
diff --git a/libgnucash/backend/sql/test/utest-gnc-backend-sql.cpp b/libgnucash/backend/sql/test/utest-gnc-backend-sql.cpp
index 27b1081..b0b9ced 100644
--- a/libgnucash/backend/sql/test/utest-gnc-backend-sql.cpp
+++ b/libgnucash/backend/sql/test/utest-gnc-backend-sql.cpp
@@ -118,7 +118,7 @@ public:
     virtual std::string quote_string (const std::string& str)
         const noexcept override { return std::string{str}; }
     int dberror() const noexcept override { return 0; }
-    void set_error(int error, unsigned int repeat, bool retry) noexcept override { return; }
+    void set_error(QofBackendError error, unsigned int repeat, bool retry) noexcept override { return; }
     bool verify() noexcept override { return true; }
     bool retry_connection(const char* msg) noexcept override { return true; }
 private:

commit 464fdeeb262ae5153b19e7b884790f5cb210c7aa
Author: John Ralls <jralls at ceridwen.us>
Date:   Fri Jun 1 13:59:06 2018 -0700

    [DBI Backend] Remove unused TableOpTypes.

diff --git a/libgnucash/backend/dbi/gnc-backend-dbi.hpp b/libgnucash/backend/dbi/gnc-backend-dbi.hpp
index 07b92e6..d31bab9 100644
--- a/libgnucash/backend/dbi/gnc-backend-dbi.hpp
+++ b/libgnucash/backend/dbi/gnc-backend-dbi.hpp
@@ -51,9 +51,7 @@ class GncSqlRow;
  */
 enum TableOpType
 {
-    drop = 0,
-    empty,
-    backup,
+    backup = 0,
     rollback,
     drop_backup
 };
diff --git a/libgnucash/backend/dbi/gnc-dbisqlconnection.cpp b/libgnucash/backend/dbi/gnc-dbisqlconnection.cpp
index f24f693..43415e9 100644
--- a/libgnucash/backend/dbi/gnc-dbisqlconnection.cpp
+++ b/libgnucash/backend/dbi/gnc-dbisqlconnection.cpp
@@ -672,13 +672,6 @@ GncDbiSqlConnection::table_operation(TableOpType op) noexcept
             case drop_backup:
                 result = table_manage_backup (table, op);
                 break;
-            case empty:
-                result = dbi_conn_queryf (m_conn, "DELETE FROM TABLE %s",
-                                          table.c_str());
-                break;
-            case drop:
-            default:
-                result = dbi_conn_queryf (m_conn, "DROP TABLE %s", table.c_str());
                 break;
             }
         }



Summary of changes:
 libgnucash/backend/dbi/gnc-backend-dbi.hpp         |  10 +-
 libgnucash/backend/dbi/gnc-dbisqlconnection.cpp    | 187 ++++++++++++---------
 libgnucash/backend/dbi/gnc-dbisqlconnection.hpp    |  10 +-
 libgnucash/backend/dbi/gnc-dbisqlresult.cpp        |   6 +-
 libgnucash/backend/dbi/gnc-dbisqlresult.hpp        |   2 +-
 libgnucash/backend/sql/gnc-slots-sql.cpp           |   6 +-
 .../backend/sql/gnc-sql-column-table-entry.cpp     |   2 +-
 .../backend/sql/gnc-sql-column-table-entry.hpp     |  31 ++++
 libgnucash/backend/sql/gnc-sql-connection.hpp      |   3 +-
 libgnucash/backend/sql/gnc-sql-result.hpp          |   4 +-
 .../backend/sql/test/utest-gnc-backend-sql.cpp     |   4 +-
 11 files changed, 166 insertions(+), 99 deletions(-)



More information about the gnucash-changes mailing list