Line data Source code
1 : /********************************************************************\
2 : * gnc-address-sql.c -- address sql backend implementation *
3 : * *
4 : * This program is free software; you can redistribute it and/or *
5 : * modify it under the terms of the GNU General Public License as *
6 : * published by the Free Software Foundation; either version 2 of *
7 : * the License, or (at your option) any later version. *
8 : * *
9 : * This program is distributed in the hope that it will be useful, *
10 : * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 : * GNU General Public License for more details. *
13 : * *
14 : * You should have received a copy of the GNU General Public License*
15 : * along with this program; if not, contact: *
16 : * *
17 : * Free Software Foundation Voice: +1-617-542-5942 *
18 : * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
19 : * Boston, MA 02110-1301, USA gnu@gnu.org *
20 : * *
21 : \********************************************************************/
22 :
23 : /** @file gnc-address-sql.c
24 : * @brief load and save address data to SQL
25 : * @author Copyright (c) 2007-2008 Phil Longstaff <plongstaff@rogers.com>
26 : *
27 : * This file implements the top-level QofBackend API for saving/
28 : * restoring data to/from an SQL database
29 : */
30 : #include <glib.h>
31 :
32 : #include <config.h>
33 :
34 : #include "gnc-engine.h"
35 :
36 : #include "gncAddress.h"
37 : #include <cstdlib>
38 : #include <cstring>
39 : #include <sstream>
40 : #include "gnc-sql-backend.hpp"
41 : #include "gnc-sql-column-table-entry.hpp"
42 :
43 : G_GNUC_UNUSED static QofLogModule log_module = G_LOG_DOMAIN;
44 :
45 : #define ADDRESS_MAX_NAME_LEN 1024
46 : #define ADDRESS_MAX_ADDRESS_LINE_LEN 1024
47 : #define ADDRESS_MAX_PHONE_LEN 128
48 : #define ADDRESS_MAX_FAX_LEN 128
49 : #define ADDRESS_MAX_EMAIL_LEN 256
50 :
51 : static EntryVec col_table
52 : ({
53 : std::make_shared<GncSqlColumnTableEntryImpl<CT_STRING>>(
54 : "name", CT_STRING, ADDRESS_MAX_NAME_LEN, COL_NNUL, "name"),
55 : gnc_sql_make_table_entry<CT_STRING>(
56 : "addr1", ADDRESS_MAX_ADDRESS_LINE_LEN, COL_NNUL, "addr1"),
57 : gnc_sql_make_table_entry<CT_STRING>(
58 : "addr2", ADDRESS_MAX_ADDRESS_LINE_LEN, COL_NNUL, "addr2"),
59 : gnc_sql_make_table_entry<CT_STRING>(
60 : "addr3", ADDRESS_MAX_ADDRESS_LINE_LEN, COL_NNUL, "addr3"),
61 : gnc_sql_make_table_entry<CT_STRING>(
62 : "addr4", ADDRESS_MAX_ADDRESS_LINE_LEN, COL_NNUL, "addr4"),
63 : gnc_sql_make_table_entry<CT_STRING>(
64 : "phone", ADDRESS_MAX_PHONE_LEN, COL_NNUL, "phone"),
65 : gnc_sql_make_table_entry<CT_STRING>(
66 : "fax", ADDRESS_MAX_FAX_LEN, COL_NNUL, "fax" ),
67 : gnc_sql_make_table_entry<CT_STRING>(
68 : "email", ADDRESS_MAX_EMAIL_LEN, COL_NNUL, "email"),
69 : });
70 :
71 : typedef void (*AddressSetterFunc) (gpointer, GncAddress*);
72 : typedef GncAddress* (*AddressGetterFunc) (const gpointer);
73 :
74 : template<> void
75 4 : GncSqlColumnTableEntryImpl<CT_ADDRESS>::load (const GncSqlBackend* sql_be,
76 : GncSqlRow& row,
77 : QofIdTypeConst obj_name,
78 : gpointer pObject) const noexcept
79 : {
80 4 : g_return_if_fail (sql_be != NULL);
81 4 : g_return_if_fail (pObject != NULL);
82 :
83 4 : auto addr = gncAddressCreate (sql_be->book(), QOF_INSTANCE(pObject));
84 :
85 40 : for (auto const& subtable_row : col_table)
86 : {
87 64 : auto buf = std::string{m_col_name} + "_" + subtable_row->m_col_name;
88 32 : auto val = row.get_string_at_col (buf.c_str());
89 32 : auto sub_setter = subtable_row->get_setter(GNC_ID_ADDRESS);
90 32 : if (val)
91 32 : set_parameter (addr, val->c_str(), sub_setter,
92 32 : subtable_row->m_gobj_param_name);
93 32 : }
94 :
95 4 : set_parameter (pObject, addr,
96 4 : reinterpret_cast<AddressSetterFunc>(get_setter(obj_name)),
97 4 : m_gobj_param_name);
98 : }
99 :
100 : template<> void
101 24 : GncSqlColumnTableEntryImpl<CT_ADDRESS>::add_to_table(ColVec& vec) const noexcept
102 : {
103 240 : for (auto const& subtable_row : col_table)
104 : {
105 384 : auto buf = std::string{m_col_name} + "_" + subtable_row->m_col_name;
106 576 : GncSqlColumnInfo info(buf.c_str(), BCT_STRING, subtable_row->m_size,
107 384 : true, false, m_flags & COL_PKEY, m_flags & COL_NNUL);
108 192 : vec.emplace_back(std::move(info));
109 192 : }
110 24 : }
111 :
112 : /* char is unusual in that we get a pointer but don't deref it to pass
113 : * it to operator<<().
114 : */
115 : template<> void
116 4 : GncSqlColumnTableEntryImpl<CT_ADDRESS>::add_to_query(QofIdTypeConst obj_name,
117 : const gpointer pObject,
118 : PairVec& vec) const noexcept
119 : {
120 4 : auto addr(get_row_value_from_object<char*>(obj_name, pObject));
121 4 : if (addr == nullptr) return;
122 :
123 40 : for (auto const& subtable_row : col_table)
124 : {
125 32 : auto s = subtable_row->get_row_value_from_object<char*>(GNC_ID_ADDRESS,
126 : addr);
127 32 : if (s == nullptr)
128 0 : continue;
129 96 : auto buf = std::string{m_col_name} + "_" + subtable_row->m_col_name;
130 32 : vec.emplace_back(make_pair(buf, quote_string(s)));
131 32 : }
132 : }
133 : /* ========================== END OF FILE ===================== */
|