GnuCash c935c2f+
Loading...
Searching...
No Matches
gnc-schedxaction-sql.cpp
1/********************************************************************
2 * gnc-schedxaction-sql.c: load and save data to SQL *
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\********************************************************************/
28#include <glib.h>
29
30#include <config.h>
31
32#include "qof.h"
33#include "SchedXaction.h"
34#include "SX-book.h"
35#include "Recurrence.h"
36
37#ifdef S_SPLINT_S
38#include "splint-defs.h"
39#endif
40
41#include "gnc-sql-connection.hpp"
42#include "gnc-sql-backend.hpp"
43#include "gnc-sql-object-backend.hpp"
44#include "gnc-sql-column-table-entry.hpp"
45#include "gnc-schedxaction-sql.h"
46#include "gnc-slots-sql.h"
47#include "gnc-recurrence-sql.h"
48#include "gnc-transaction-sql.h"
49
50
51#define SCHEDXACTION_TABLE "schedxactions"
52#define TABLE_VERSION 1
53
54G_GNUC_UNUSED static QofLogModule log_module = G_LOG_DOMAIN;
55
56#define SX_MAX_NAME_LEN 2048
57
58static const EntryVec col_table
59({
60 gnc_sql_make_table_entry<CT_GUID>("guid", 0, COL_NNUL | COL_PKEY, "guid"),
61 gnc_sql_make_table_entry<CT_STRING>("name", SX_MAX_NAME_LEN, 0, "name"),
62 gnc_sql_make_table_entry<CT_BOOLEAN>("enabled", 0, COL_NNUL, "enabled"),
63 gnc_sql_make_table_entry<CT_GDATE>("start_date", 0, 0, "start-date"),
64 gnc_sql_make_table_entry<CT_GDATE>("end_date", 0, 0, "end-date"),
65 gnc_sql_make_table_entry<CT_GDATE>(
66 "last_occur", 0, 0, "last-occurance-date"),
67 gnc_sql_make_table_entry<CT_INT>(
68 "num_occur", 0, COL_NNUL, "num-occurance"),
69 gnc_sql_make_table_entry<CT_INT>("rem_occur", 0, COL_NNUL, "rem-occurance"),
70 gnc_sql_make_table_entry<CT_BOOLEAN>(
71 "auto_create", 0, COL_NNUL, "auto-create"),
72 gnc_sql_make_table_entry<CT_BOOLEAN>(
73 "auto_notify", 0, COL_NNUL, "auto-create-notify"),
74 gnc_sql_make_table_entry<CT_INT>(
75 "adv_creation", 0, COL_NNUL, "advance-creation-days"),
76 gnc_sql_make_table_entry<CT_INT>(
77 "adv_notify", 0, COL_NNUL, "advance-reminder-days"),
78 gnc_sql_make_table_entry<CT_INT>(
79 "instance_count", 0, COL_NNUL, "instance-count"),
80 gnc_sql_make_table_entry<CT_ACCOUNTREF>(
81 "template_act_guid", 0, COL_NNUL, "template-account"),
82});
83
84GncSqlSchedXactionBackend::GncSqlSchedXactionBackend() :
85 GncSqlObjectBackend(TABLE_VERSION, GNC_ID_SCHEDXACTION,
86 SCHEDXACTION_TABLE, col_table) {}
87
88/* ================================================================= */
89static SchedXaction*
90load_single_sx (GncSqlBackend* sql_be, GncSqlRow& row)
91{
92 const GncGUID* guid;
93 SchedXaction* pSx;
94 GList* schedule;
95 GDate start_date;
96
97 g_return_val_if_fail (sql_be != NULL, NULL);
98
99 guid = gnc_sql_load_guid (sql_be, row);
100 g_assert (guid != NULL);
101 pSx = xaccSchedXactionMalloc (sql_be->book());
102
103 gnc_sx_begin_edit (pSx);
104 gnc_sql_load_object (sql_be, row, GNC_SX_ID, pSx, col_table);
105 schedule = gnc_sql_recurrence_load_list (sql_be, guid);
106 gnc_sx_set_schedule (pSx, schedule);
107 gnc_sx_commit_edit (pSx);
108 gnc_sql_transaction_load_tx_for_account (sql_be, pSx->template_acct);
109
110 g_object_get (pSx, "start-date", &start_date, NULL);
111
112 return pSx;
113}
114
115/* Because SchedXaction doesn't define a lookup function: */
116static inline SchedXaction*
117gnc_sx_lookup (const GncGUID *guid, const QofBook *book)
118{
119 QOF_BOOK_RETURN_ENTITY(book, guid, GNC_ID_SCHEDXACTION, SchedXaction);
120}
121
122void
124{
125 g_return_if_fail (sql_be != NULL);
126
127 std::string sql("SELECT * FROM " SCHEDXACTION_TABLE);
128 auto stmt = sql_be->create_statement_from_sql(sql);
129 if (stmt == nullptr) return;
130 auto result = sql_be->execute_select_statement(stmt);
131 SchedXactions* sxes;
132 sxes = gnc_book_get_schedxactions (sql_be->book());
133
134 for (auto row : *result)
135 {
136 SchedXaction* sx;
137
138 sx = load_single_sx (sql_be, row);
139 if (sx != nullptr)
140 gnc_sxes_add_sx (sxes, sx);
141 }
142 std::string pkey(col_table[0]->name());
143 sql = "SELECT DISTINCT ";
144 sql += pkey + " FROM " SCHEDXACTION_TABLE;
145 gnc_sql_slots_load_for_sql_subquery (sql_be, sql,
146 (BookLookupFn)gnc_sx_lookup);
147}
148
149
150/* ================================================================= */
151bool
153{
154 SchedXaction* pSx;
155 const GncGUID* guid;
156 E_DB_OPERATION op;
157 gboolean is_infant;
158 gboolean is_ok;
159
160 g_return_val_if_fail (sql_be != NULL, FALSE);
161 g_return_val_if_fail (inst != NULL, FALSE);
162 g_return_val_if_fail (GNC_IS_SX (inst), FALSE);
163
164 pSx = GNC_SX (inst);
165
166 is_infant = qof_instance_get_infant (inst);
168 {
169 op = OP_DB_DELETE;
170 }
171 else if (sql_be->pristine() || is_infant)
172 {
173 op = OP_DB_INSERT;
174 }
175 else
176 {
177 op = OP_DB_UPDATE;
178 }
179 is_ok = sql_be->do_db_operation(op, SCHEDXACTION_TABLE, GNC_SX_ID, pSx,
180 col_table);
181 guid = qof_instance_get_guid (inst);
182 if (op == OP_DB_INSERT || op == OP_DB_UPDATE)
183 {
184 gnc_sql_recurrence_save_list (sql_be, guid, gnc_sx_get_schedule (pSx));
185 }
186 else
187 {
188 gnc_sql_recurrence_delete (sql_be, guid);
189 }
190
191 if (is_ok)
192 {
193 // Now, commit any slots
194 if (op == OP_DB_INSERT || op == OP_DB_UPDATE)
195 {
196 is_ok = gnc_sql_slots_save (sql_be, guid, is_infant, inst);
197 }
198 else
199 {
200 is_ok = gnc_sql_slots_delete (sql_be, guid);
201 }
202 }
203
204 return is_ok;
205}
206
207/* ========================== END OF FILE ===================== */
Anchor Scheduled Transaction info in a book.
Scheduled Transactions public handling routines.
Main SQL backend structure.
GncSqlResultPtr execute_select_statement(const GncSqlStatementPtr &stmt) const noexcept
Executes an SQL SELECT statement and returns the result rows.
bool do_db_operation(E_DB_OPERATION op, const char *table_name, QofIdTypeConst obj_name, gpointer pObject, const EntryVec &table) const noexcept
Performs an operation on the database.
Encapsulates per-class table schema with functions to load, create a table, commit a changed front-en...
Row of SQL Query results.
void load_all(GncSqlBackend *) override
Load all objects of m_type in the database into memory.
bool commit(GncSqlBackend *sql_be, QofInstance *inst) override
UPDATE/INSERT a single instance of m_type_name into the database.
load and save accounts data to SQL
load and save accounts data to SQL
load and save data to SQL
#define QOF_BOOK_RETURN_ENTITY(book, guid, e_type, c_type)
Encapsulates all the information about a dataset manipulated by QOF.
Definition qofbook.h:101
const GncGUID * qof_instance_get_guid(gconstpointer inst)
Return the GncGUID of this instance.
gboolean qof_instance_get_destroying(gconstpointer ptr)
Retrieve the flag that indicates whether or not this object is about to be destroyed.
void gnc_sx_set_schedule(SchedXaction *sx, GList *schedule)
SchedXaction * xaccSchedXactionMalloc(QofBook *book)
Creates and initializes a scheduled transaction.
GList * gnc_sx_get_schedule(const SchedXaction *sx)
The type used to store guids in C.
Definition guid.h:75
QofBook reference.
Definition qofbook-p.hpp:47