mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Fix date corruption in SQL load.
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.
This commit is contained in:
parent
e5561bd7ab
commit
8fe2cb6fa8
@ -70,9 +70,9 @@ static void entry_set_bill (gpointer pObject, gpointer val);
|
|||||||
static EntryVec col_table
|
static EntryVec col_table
|
||||||
({
|
({
|
||||||
gnc_sql_make_table_entry<CT_GUID>("guid", 0, COL_NNUL | COL_PKEY, "guid"),
|
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),
|
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),
|
ENTRY_DATE_ENTERED, true),
|
||||||
gnc_sql_make_table_entry<CT_STRING>(
|
gnc_sql_make_table_entry<CT_STRING>(
|
||||||
"description", MAX_DESCRIPTION_LEN, 0, "description"),
|
"description", MAX_DESCRIPTION_LEN, 0, "description"),
|
||||||
|
@ -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_GUID>("guid", 0, COL_NNUL | COL_PKEY, "guid"),
|
||||||
gnc_sql_make_table_entry<CT_STRING>("id", MAX_ID_LEN, COL_NNUL, INVOICE_ID,
|
gnc_sql_make_table_entry<CT_STRING>("id", MAX_ID_LEN, COL_NNUL, INVOICE_ID,
|
||||||
true),
|
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),
|
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),
|
true),
|
||||||
gnc_sql_make_table_entry<CT_STRING>("notes", MAX_NOTES_LEN, COL_NNUL,
|
gnc_sql_make_table_entry<CT_STRING>("notes", MAX_NOTES_LEN, COL_NNUL,
|
||||||
"notes"),
|
"notes"),
|
||||||
|
@ -454,6 +454,67 @@ GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_query(QofIdTypeConst obj_name,
|
|||||||
"NULL"));
|
"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
|
#define DATE_COL_SIZE 8
|
||||||
|
@ -70,6 +70,7 @@ enum GncSqlObjectType
|
|||||||
CT_INT,
|
CT_INT,
|
||||||
CT_INT64,
|
CT_INT64,
|
||||||
CT_TIMESPEC,
|
CT_TIMESPEC,
|
||||||
|
CT_TIME64,
|
||||||
CT_GDATE,
|
CT_GDATE,
|
||||||
CT_NUMERIC,
|
CT_NUMERIC,
|
||||||
CT_DOUBLE,
|
CT_DOUBLE,
|
||||||
|
Loading…
Reference in New Issue
Block a user