Branch data Line data Source code
1 : : /********************************************************************\
2 : : * gnc-job-sql.c -- job sql backend *
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-job-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 <stdlib.h>
35 : : #include <string.h>
36 : :
37 : : #include "gncJobP.h"
38 : :
39 : : #include "gnc-sql-connection.hpp"
40 : : #include "gnc-sql-backend.hpp"
41 : : #include "gnc-sql-object-backend.hpp"
42 : : #include "gnc-sql-column-table-entry.hpp"
43 : : #include "gnc-slots-sql.h"
44 : : #include "gnc-job-sql.h"
45 : :
46 : : #define _GNC_MOD_NAME GNC_ID_JOB
47 : :
48 : : G_GNUC_UNUSED static QofLogModule log_module = G_LOG_DOMAIN;
49 : :
50 : : #define TABLE_NAME "jobs"
51 : : #define TABLE_VERSION 1
52 : :
53 : : #define MAX_ID_LEN 2048
54 : : #define MAX_NAME_LEN 2048
55 : : #define MAX_REFERENCE_LEN 2048
56 : :
57 : : static EntryVec col_table
58 : : ({
59 : : gnc_sql_make_table_entry<CT_GUID>("guid", 0, COL_NNUL | COL_PKEY, "guid"),
60 : : gnc_sql_make_table_entry<CT_STRING>("id", MAX_ID_LEN, COL_NNUL,
61 : : JOB_ID, true),
62 : : gnc_sql_make_table_entry<CT_STRING>("name", MAX_NAME_LEN, COL_NNUL, "name"),
63 : : gnc_sql_make_table_entry<CT_STRING>("reference", MAX_REFERENCE_LEN,
64 : : COL_NNUL, JOB_REFERENCE, true),
65 : : gnc_sql_make_table_entry<CT_BOOLEAN>("active", 0, COL_NNUL,
66 : : (QofAccessFunc)gncJobGetActive,
67 : : (QofSetterFunc)gncJobSetActive),
68 : : gnc_sql_make_table_entry<CT_OWNERREF>("owner", 0, 0,
69 : : (QofAccessFunc)gncJobGetOwner,
70 : : (QofSetterFunc)gncJobSetOwner),
71 : : });
72 : :
73 : 10 : GncSqlJobBackend::GncSqlJobBackend() :
74 : : GncSqlObjectBackend(TABLE_VERSION, GNC_ID_JOB,
75 : 10 : TABLE_NAME, col_table) {}
76 : :
77 : : static GncJob*
78 : 1 : load_single_job (GncSqlBackend* sql_be, GncSqlRow& row)
79 : : {
80 : : const GncGUID* guid;
81 : : GncJob* pJob;
82 : :
83 : 1 : g_return_val_if_fail (sql_be != NULL, NULL);
84 : :
85 : 1 : guid = gnc_sql_load_guid (sql_be, row);
86 : 1 : pJob = gncJobLookup (sql_be->book(), guid);
87 : 1 : if (pJob == NULL)
88 : : {
89 : 0 : pJob = gncJobCreate (sql_be->book());
90 : : }
91 : 1 : gnc_sql_load_object (sql_be, row, GNC_ID_JOB, pJob, col_table);
92 : 1 : qof_instance_mark_clean (QOF_INSTANCE (pJob));
93 : :
94 : 1 : return pJob;
95 : : }
96 : :
97 : : /* Because gncJobLookup has the arguments backwards: */
98 : : static inline GncJob*
99 : 0 : gnc_job_lookup (const GncGUID *guid, const QofBook *book)
100 : : {
101 : 0 : QOF_BOOK_RETURN_ENTITY(book, guid, GNC_ID_JOB, GncJob);
102 : : }
103 : :
104 : : void
105 : 5 : GncSqlJobBackend::load_all (GncSqlBackend* sql_be)
106 : : {
107 : 5 : g_return_if_fail (sql_be != NULL);
108 : :
109 : 5 : std::string sql("SELECT * FROM " TABLE_NAME);
110 : 5 : auto stmt = sql_be->create_statement_from_sql(sql);
111 : 5 : auto result = sql_be->execute_select_statement(stmt);
112 : :
113 : 6 : for (auto row : *result)
114 : 6 : load_single_job (sql_be, row);
115 : :
116 : 5 : std::string pkey(col_table[0]->name());
117 : 5 : sql = "SELECT DISTINCT ";
118 : 5 : sql += pkey + " FROM " TABLE_NAME;
119 : 5 : gnc_sql_slots_load_for_sql_subquery (sql_be, sql,
120 : : (BookLookupFn)gnc_job_lookup);
121 : 5 : }
122 : :
123 : : /* ================================================================= */
124 : : static gboolean
125 : 1 : job_should_be_saved (GncJob* job)
126 : : {
127 : : const char* id;
128 : :
129 : 1 : g_return_val_if_fail (job != NULL, FALSE);
130 : :
131 : : /* make sure this is a valid job before we save it -- should have an ID */
132 : 1 : id = gncJobGetID (job);
133 : 1 : if (id == NULL || *id == '\0')
134 : : {
135 : 0 : return FALSE;
136 : : }
137 : :
138 : 1 : return TRUE;
139 : : }
140 : :
141 : : static void
142 : 1 : write_single_job (QofInstance* term_p, gpointer data_p)
143 : : {
144 : 1 : auto s = reinterpret_cast<write_objects_t*>(data_p);
145 : :
146 : 1 : g_return_if_fail (term_p != NULL);
147 : 1 : g_return_if_fail (GNC_IS_JOB (term_p));
148 : 1 : g_return_if_fail (data_p != NULL);
149 : :
150 : 1 : if (s->is_ok && job_should_be_saved (GNC_JOB (term_p)))
151 : : {
152 : 1 : s->commit (term_p);
153 : : }
154 : : }
155 : :
156 : : bool
157 : 5 : GncSqlJobBackend::write (GncSqlBackend* sql_be)
158 : : {
159 : 5 : g_return_val_if_fail (sql_be != NULL, FALSE);
160 : 5 : write_objects_t data{sql_be, true, this};
161 : :
162 : 5 : qof_object_foreach (GNC_ID_JOB, sql_be->book(), write_single_job, &data);
163 : :
164 : 5 : return data.is_ok;
165 : : }
166 : :
167 : : /* ========================== END OF FILE ===================== */
|