Skip to content

Commit

Permalink
Fix date corruption in SQL load.
Browse files Browse the repository at this point in the history
Four date elements were affected: GncEntry::date, GncEntry::date_entered,
GncInvoice::opened, and GncInvoice::posted. The problem arose during the
cleansing of Timespec from the reports; the setter functions for those
elements were converted to time64 but no provision was made to the SQL
backend to pass them time64 instead of Timespec*.

This commit adds a new column type, CT_TIME64, and changes the column
types for those elements to CT_TIME64.
  • Loading branch information
jralls committed Mar 16, 2018
1 parent e5561bd commit 8fe2cb6
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 4 deletions.
4 changes: 2 additions & 2 deletions libgnucash/backend/sql/gnc-entry-sql.cpp
Expand Up @@ -70,9 +70,9 @@ static void entry_set_bill (gpointer pObject, gpointer val);
static EntryVec col_table
({
gnc_sql_make_table_entry<CT_GUID>("guid", 0, COL_NNUL | COL_PKEY, "guid"),
gnc_sql_make_table_entry<CT_TIMESPEC>("date", 0, COL_NNUL, ENTRY_DATE,
gnc_sql_make_table_entry<CT_TIME64>("date", 0, COL_NNUL, ENTRY_DATE,
true),
gnc_sql_make_table_entry<CT_TIMESPEC>("date_entered", 0, 0,
gnc_sql_make_table_entry<CT_TIME64>("date_entered", 0, 0,
ENTRY_DATE_ENTERED, true),
gnc_sql_make_table_entry<CT_STRING>(
"description", MAX_DESCRIPTION_LEN, 0, "description"),
Expand Down
4 changes: 2 additions & 2 deletions libgnucash/backend/sql/gnc-invoice-sql.cpp
Expand Up @@ -67,9 +67,9 @@ static EntryVec col_table
gnc_sql_make_table_entry<CT_GUID>("guid", 0, COL_NNUL | COL_PKEY, "guid"),
gnc_sql_make_table_entry<CT_STRING>("id", MAX_ID_LEN, COL_NNUL, INVOICE_ID,
true),
gnc_sql_make_table_entry<CT_TIMESPEC>("date_opened", 0, 0, INVOICE_OPENED,
gnc_sql_make_table_entry<CT_TIME64>("date_opened", 0, 0, INVOICE_OPENED,
true),
gnc_sql_make_table_entry<CT_TIMESPEC>("date_posted", 0, 0, INVOICE_POSTED,
gnc_sql_make_table_entry<CT_TIME64>("date_posted", 0, 0, INVOICE_POSTED,
true),
gnc_sql_make_table_entry<CT_STRING>("notes", MAX_NOTES_LEN, COL_NNUL,
"notes"),
Expand Down
61 changes: 61 additions & 0 deletions libgnucash/backend/sql/gnc-sql-column-table-entry.cpp
Expand Up @@ -454,6 +454,67 @@ GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_query(QofIdTypeConst obj_name,
"NULL"));
}
}
/* ----------------------------------------------------------------- */
typedef time64 (*Time64AccessFunc) (const gpointer);
typedef void (*Time64SetterFunc) (const gpointer, time64);

template<> void
GncSqlColumnTableEntryImpl<CT_TIME64>::load (const GncSqlBackend* sql_be,
GncSqlRow& row,
QofIdTypeConst obj_name,
gpointer pObject)
const noexcept
{
time64 t;
g_return_if_fail (m_gobj_param_name != nullptr || get_setter(obj_name) != nullptr);
try
{
t = row.get_time64_at_col (m_col_name);
}
catch (std::invalid_argument)
{
try
{
auto val = row.get_string_at_col(m_col_name);
GncDateTime time(val);
t = static_cast<time64>(time);
}
catch (std::invalid_argument)
{
return;
}
}
set_parameter(pObject, t,
reinterpret_cast<Time64SetterFunc>(get_setter(obj_name)),
m_gobj_param_name);
}

template<> void
GncSqlColumnTableEntryImpl<CT_TIME64>::add_to_table(ColVec& vec) const noexcept
{

GncSqlColumnInfo info{*this, BCT_DATETIME, TIMESPEC_COL_SIZE, FALSE};
vec.emplace_back(std::move(info));
}

template<> void
GncSqlColumnTableEntryImpl<CT_TIME64>::add_to_query(QofIdTypeConst obj_name,
const gpointer pObject,
PairVec& vec) const noexcept
{
auto t = get_row_value_from_object<time64>(obj_name, pObject);
if (t > MINTIME && t < MAXTIME)
{
GncDateTime time(t);
vec.emplace_back (std::make_pair (std::string{m_col_name},
time.format_zulu ("'%Y-%m-%d %H:%M:%S'")));
}
else
{
vec.emplace_back (std::make_pair (std::string{m_col_name},
"NULL"));
}
}

/* ----------------------------------------------------------------- */
#define DATE_COL_SIZE 8
Expand Down
1 change: 1 addition & 0 deletions libgnucash/backend/sql/gnc-sql-column-table-entry.hpp
Expand Up @@ -70,6 +70,7 @@ enum GncSqlObjectType
CT_INT,
CT_INT64,
CT_TIMESPEC,
CT_TIME64,
CT_GDATE,
CT_NUMERIC,
CT_DOUBLE,
Expand Down

0 comments on commit 8fe2cb6

Please sign in to comment.