diff --git a/libgnucash/backend/sql/gnc-entry-sql.cpp b/libgnucash/backend/sql/gnc-entry-sql.cpp index 9beb95b96c..764ffa49bf 100644 --- a/libgnucash/backend/sql/gnc-entry-sql.cpp +++ b/libgnucash/backend/sql/gnc-entry-sql.cpp @@ -70,9 +70,9 @@ static void entry_set_bill (gpointer pObject, gpointer val); static EntryVec col_table ({ gnc_sql_make_table_entry("guid", 0, COL_NNUL | COL_PKEY, "guid"), - gnc_sql_make_table_entry("date", 0, COL_NNUL, ENTRY_DATE, + gnc_sql_make_table_entry("date", 0, COL_NNUL, ENTRY_DATE, true), - gnc_sql_make_table_entry("date_entered", 0, 0, + gnc_sql_make_table_entry("date_entered", 0, 0, ENTRY_DATE_ENTERED, true), gnc_sql_make_table_entry( "description", MAX_DESCRIPTION_LEN, 0, "description"), diff --git a/libgnucash/backend/sql/gnc-invoice-sql.cpp b/libgnucash/backend/sql/gnc-invoice-sql.cpp index 769aa2da99..e0cc87a782 100644 --- a/libgnucash/backend/sql/gnc-invoice-sql.cpp +++ b/libgnucash/backend/sql/gnc-invoice-sql.cpp @@ -67,9 +67,9 @@ static EntryVec col_table gnc_sql_make_table_entry("guid", 0, COL_NNUL | COL_PKEY, "guid"), gnc_sql_make_table_entry("id", MAX_ID_LEN, COL_NNUL, INVOICE_ID, true), - gnc_sql_make_table_entry("date_opened", 0, 0, INVOICE_OPENED, + gnc_sql_make_table_entry("date_opened", 0, 0, INVOICE_OPENED, true), - gnc_sql_make_table_entry("date_posted", 0, 0, INVOICE_POSTED, + gnc_sql_make_table_entry("date_posted", 0, 0, INVOICE_POSTED, true), gnc_sql_make_table_entry("notes", MAX_NOTES_LEN, COL_NNUL, "notes"), diff --git a/libgnucash/backend/sql/gnc-sql-column-table-entry.cpp b/libgnucash/backend/sql/gnc-sql-column-table-entry.cpp index 608067911a..09d6f3a6ac 100644 --- a/libgnucash/backend/sql/gnc-sql-column-table-entry.cpp +++ b/libgnucash/backend/sql/gnc-sql-column-table-entry.cpp @@ -454,6 +454,67 @@ GncSqlColumnTableEntryImpl::add_to_query(QofIdTypeConst obj_name, "NULL")); } } +/* ----------------------------------------------------------------- */ +typedef time64 (*Time64AccessFunc) (const gpointer); +typedef void (*Time64SetterFunc) (const gpointer, time64); + +template<> void +GncSqlColumnTableEntryImpl::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(time); + } + catch (std::invalid_argument) + { + return; + } + } + set_parameter(pObject, t, + reinterpret_cast(get_setter(obj_name)), + m_gobj_param_name); +} + +template<> void +GncSqlColumnTableEntryImpl::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::add_to_query(QofIdTypeConst obj_name, + const gpointer pObject, + PairVec& vec) const noexcept +{ + auto t = get_row_value_from_object(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 diff --git a/libgnucash/backend/sql/gnc-sql-column-table-entry.hpp b/libgnucash/backend/sql/gnc-sql-column-table-entry.hpp index 28fbb644b4..a98801aceb 100644 --- a/libgnucash/backend/sql/gnc-sql-column-table-entry.hpp +++ b/libgnucash/backend/sql/gnc-sql-column-table-entry.hpp @@ -70,6 +70,7 @@ enum GncSqlObjectType CT_INT, CT_INT64, CT_TIMESPEC, + CT_TIME64, CT_GDATE, CT_NUMERIC, CT_DOUBLE,