24#ifndef __GNC_SQL_COLUMN_TABLE_ENTRY_HPP__
25#define __GNC_SQL_COLUMN_TABLE_ENTRY_HPP__
33#include "gnc-sql-result.hpp"
36using ColVec = std::vector<GncSqlColumnInfo>;
37using PairVec = std::vector<std::pair<std::string, std::string>>;
38using InstanceVec = std::vector<QofInstance*>;
39using uint_t =
unsigned int;
53} GncSqlBasicColumnType;
89static inline std::string
90quote_string(
const std::string& str)
92 if (str ==
"NULL" || str ==
"null")
return "NULL";
96 if (str.empty())
return "''";
98 retval.reserve(str.length() + 2);
99 retval.insert(0, 1,
'\'');
100 for (
auto c = str.begin(); c != str.end(); ++c)
131 int f,
const char* gobj_name =
nullptr,
132 const char* qof_name =
nullptr,
135 m_col_name{
name}, m_col_type{type}, m_size{s},
136 m_flags{
static_cast<ColumnFlags
>(f)},
137 m_gobj_param_name{gobj_name}, m_qof_param_name{qof_name}, m_getter{get},
157 void* pObject, PairVec& vec)
const noexcept = 0;
172 const char*
name() const noexcept {
return m_col_name; }
176 bool is_autoincr() const noexcept {
return m_flags & COL_AUTOINC; }
182 template<
typename T>
void load_from_guid_ref(
GncSqlRow& row,
184 void* pObject, T get_ref)
187 static QofLogModule log_module = G_LOG_DOMAIN;
188 g_return_if_fail (pObject != NULL);
191 auto val = row.get_string_at_col (m_col_name);
194 DEBUG(
"set parameter: No string in column %s.", m_col_name);
198 if (string_to_guid (val->c_str(), &guid))
200 auto target = get_ref(&guid);
201 if (target !=
nullptr)
202 set_parameter (pObject, target,
get_setter(obj_name),
205 DEBUG(
"GUID %s returned null %s reference.",
206 val->c_str(), m_gobj_param_name);
211 DEBUG(
"Can't load empty guid string for column %s", m_col_name);
213 DEBUG(
"Invalid GUID %s for column %s", val->c_str(), m_col_name);
219 template <
typename T> T
220 get_row_value_from_object(
QofIdTypeConst obj_name,
const void* pObject)
const;
221 template <
typename T>
void
223 const void* pObject, PairVec& vec)
const;
234 PairVec& vec)
const noexcept;
243 const char* m_col_name =
nullptr;
244 const GncSqlObjectType m_col_type;
247 const char* m_gobj_param_name =
nullptr;
248 const char* m_qof_param_name =
nullptr;
251 template <
typename T> T get_row_value_from_object(
QofIdTypeConst obj_name,
253 std::true_type)
const;
254 template <
typename T> T get_row_value_from_object(
QofIdTypeConst obj_name,
256 std::false_type)
const;
257 template <
typename T>
void add_value_to_vec(
QofIdTypeConst obj_name,
259 PairVec& vec, std::true_type)
const;
260 template <
typename T>
void add_value_to_vec(
QofIdTypeConst obj_name,
262 PairVec& vec, std::false_type)
const;
266template <GncSqlObjectType Type>
272 int f,
const char* gobj_name =
nullptr,
273 const char* qof_name =
nullptr,
280 void* pObject)
const noexcept override;
283 const noexcept override;
286using GncSqlColumnTableEntryPtr = std::shared_ptr<GncSqlColumnTableEntry>;
287using EntryVec = std::vector<GncSqlColumnTableEntryPtr>;
289template <GncSqlObjectType Type>
290std::shared_ptr<GncSqlColumnTableEntryImpl<Type>>
291gnc_sql_make_table_entry(
const char* name,
unsigned int s,
int f)
293 return std::make_shared<GncSqlColumnTableEntryImpl<Type>>(name, Type, s, f);
296template <GncSqlObjectType Type>
297std::shared_ptr<GncSqlColumnTableEntryImpl<Type>>
298gnc_sql_make_table_entry(
const char* name,
unsigned int s,
int f,
301 return std::make_shared<GncSqlColumnTableEntryImpl<Type>>(name, Type, s,
307template <GncSqlObjectType Type>
308std::shared_ptr<GncSqlColumnTableEntryImpl<Type>>
309gnc_sql_make_table_entry(
const char* name,
unsigned int s,
int f,
310 const char* param,
bool qofp)
312 return std::make_shared<GncSqlColumnTableEntryImpl<Type>>(name, Type, s,
317template <GncSqlObjectType Type>
318std::shared_ptr<GncSqlColumnTableEntryImpl<Type>>
319gnc_sql_make_table_entry(
const char* name,
unsigned int s,
int f,
322 return std::make_shared<GncSqlColumnTableEntryImpl<Type>>(
323 name, Type, s, f,
nullptr,
nullptr, get, set);
327template <
typename T> T
328GncSqlColumnTableEntry::get_row_value_from_object(
QofIdTypeConst obj_name,
329 const void* pObject)
const
331 return get_row_value_from_object<T>(obj_name, pObject,
332 std::is_pointer<T>());
335template <
typename T> T
336GncSqlColumnTableEntry::get_row_value_from_object(
QofIdTypeConst obj_name,
338 std::true_type)
const
340 g_return_val_if_fail(obj_name !=
nullptr && pObject !=
nullptr,
nullptr);
342 if (m_gobj_param_name !=
nullptr)
343 g_object_get(
const_cast<void*
>(pObject), m_gobj_param_name,
348 if (getter !=
nullptr)
349 result =
reinterpret_cast<T
>((getter)(
const_cast<void*
>(pObject),
355template <
typename T> T
356GncSqlColumnTableEntry::get_row_value_from_object(
QofIdTypeConst obj_name,
358 std::false_type)
const
360 g_return_val_if_fail(obj_name !=
nullptr && pObject !=
nullptr,
362 T result =
static_cast<T
>(0);
363 if (m_gobj_param_name !=
nullptr)
364 g_object_get(
const_cast<void*
>(pObject), m_gobj_param_name,
369 if (getter !=
nullptr)
371 result =
static_cast<T
>(
reinterpret_cast<intptr_t
>((getter)(
const_cast<void*
>(pObject),
378template <
typename T>
void
383 add_value_to_vec<T>(obj_name, pObject, vec, std::is_pointer<T>());
386template <
typename T>
void
389 PairVec& vec, std::true_type)
const
391 T s = get_row_value_from_object<T>(obj_name, pObject);
395 std::ostringstream stream;
397 vec.emplace_back(std::make_pair(std::string{m_col_name}, stream.str()));
402template <>
inline void
403GncSqlColumnTableEntry::add_value_to_vec<double*>(
QofIdTypeConst obj_name,
405 PairVec& vec, std::true_type)
const
407 double* s = get_row_value_from_object<double*>(obj_name, pObject);
411 std::ostringstream stream;
412 stream << std::setprecision(12) << std::fixed << *s;
413 vec.emplace_back(std::make_pair(std::string{m_col_name}, stream.str()));
418template <
typename T>
void
421 PairVec& vec, std::false_type)
const
423 T s = get_row_value_from_object<T>(obj_name, pObject);
425 std::ostringstream stream;
427 vec.emplace_back(std::make_pair(std::string{m_col_name}, stream.str()));
431template <>
inline void
432GncSqlColumnTableEntry::add_value_to_vec<double>(
QofIdTypeConst obj_name,
434 PairVec& vec, std::false_type)
const
436 double s = *get_row_value_from_object<double*>(obj_name, pObject);
438 std::ostringstream stream;
439 stream << std::setprecision(12) << std::fixed << s;
440 vec.emplace_back(std::make_pair(std::string{m_col_name}, stream.str()));
455 const EntryVec&
table);
472uint_t gnc_sql_append_guids_to_sql (std::stringstream& sql,
473 const InstanceVec& instances);
481 unsigned int size = 0,
bool unicode =
false,
482 bool autoinc =
false,
bool primary =
false,
483 bool not_null =
false) :
488 unsigned int size = 0,
bool unicode =
true) :
523template <
typename T,
typename P,
typename F>
524void set_parameter(T
object, P item, F& setter)
526 (*setter)(object, item);
529template <
typename T,
typename P>
530void set_parameter(T
object, P item,
QofSetterFunc setter, std::true_type)
532 (*setter)(object, (
void*)item);
535template <
typename T,
typename P>
536void set_parameter(T
object, P item,
QofSetterFunc setter, std::false_type)
538 (*setter)(object, (
void*)(&item));
541template <
typename T,
typename P>
544 set_parameter(
object, item, setter, std::is_pointer<P>());
555template <
typename T,
typename P>
556void set_parameter(T
object, P item,
const char* property)
564 g_object_set(
object, property, item,
nullptr);
579template <
typename T,
typename P,
typename F>
580void set_parameter(T
object, P item, F setter,
const char* property)
583 set_parameter(
object, item, property);
585 set_parameter(
object, item, setter);
Main SQL backend structure.
void add_to_query(QofIdTypeConst obj_name, void *pObject, PairVec &vec) const noexcept override
Add a pair of the table column heading and object's value's string representation to a PairVec; used ...
void add_to_table(ColVec &vec) const noexcept override
Add a GncSqlColumnInfo structure for the column type to a ColVec.
void load(const GncSqlBackend *sql_be, GncSqlRow &row, QofIdTypeConst obj_name, void *pObject) const noexcept override
Load a value into an object from the database row.
Contains all of the information required to copy information between an object and the database for a...
bool is_autoincr() const noexcept
Report if the entry is an auto-increment field.
QofSetterFunc get_setter(QofIdTypeConst obj_name) const noexcept
Retrieve the setter function depending on whether it's an auto-increment field, a QofClass getter,...
void add_objectref_guid_to_query(QofIdTypeConst obj_name, const void *pObject, PairVec &vec) const noexcept
Adds a name/guid std::pair to a PairVec for creating a query.
virtual void add_to_table(ColVec &vec) const noexcept=0
Add a GncSqlColumnInfo structure for the column type to a ColVec.
virtual void add_to_query(QofIdTypeConst obj_name, void *pObject, PairVec &vec) const noexcept=0
Add a pair of the table column heading and object's value's string representation to a PairVec; used ...
const char * name() const noexcept
Retrieve the field name so that we don't need to make create_single_col_select_statement and friend.
virtual void load(const GncSqlBackend *sql_be, GncSqlRow &row, QofIdTypeConst obj_name, void *pObject) const noexcept=0
Load a value into an object from the database row.
void add_objectref_guid_to_table(ColVec &vec) const noexcept
Adds a column info structure for an object reference GncGUID to a ColVec.
QofAccessFunc get_getter(QofIdTypeConst obj_name) const noexcept
Retrieve the getter function depending on whether it's an auto-increment field, a QofClass getter,...
Row of SQL Query results.
gpointer(* QofAccessFunc)(gpointer object, const QofParam *param)
The QofAccessFunc defines an arbitrary function pointer for access functions.
void(* QofSetterFunc)(gpointer, gpointer)
The QofSetterFunc defines an function pointer for parameter setters.
const gchar * QofIdTypeConst
QofIdTypeConst declaration.
#define DEBUG(format, args...)
Print a debugging message.
gboolean qof_commit_edit_part2(QofInstance *inst, void(*on_error)(QofInstance *, QofBackendError), void(*on_done)(QofInstance *), void(*on_free)(QofInstance *))
part2 – deal with the backend
gboolean qof_commit_edit(QofInstance *inst)
commit_edit helpers
gboolean qof_begin_edit(QofInstance *inst)
begin_edit
The type used to store guids in C.
information required to create a column in a table.
GncSqlBasicColumnType m_type
Column basic type.
unsigned int m_size
Column size (string types)
bool m_not_null
Column forbids NULL values.
bool m_unicode
Column is unicode (string types)
bool m_autoinc
Column is autoinc (int type)
bool m_primary_key
Column is the primary key.
std::string m_name
Column name.