GnuCash  2.6.99
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
gnc-job-sql.c
Go to the documentation of this file.
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 [email protected] *
20  * *
21 \********************************************************************/
22 
31 #include "config.h"
32 
33 #include <glib.h>
34 #include <stdlib.h>
35 #include <string.h>
36 
37 #include "gnc-backend-sql.h"
38 #include "gnc-slots-sql.h"
39 
40 #include "gncJobP.h"
41 #include "gnc-job-sql.h"
42 #include "gnc-owner-sql.h"
43 
44 #define _GNC_MOD_NAME GNC_ID_JOB
45 
46 G_GNUC_UNUSED static QofLogModule log_module = G_LOG_DOMAIN;
47 
48 #define TABLE_NAME "jobs"
49 #define TABLE_VERSION 1
50 
51 #define MAX_ID_LEN 2048
52 #define MAX_NAME_LEN 2048
53 #define MAX_REFERENCE_LEN 2048
54 
55 static GncSqlColumnTableEntry col_table[] =
56 {
57  { "guid", CT_GUID, 0, COL_NNUL | COL_PKEY, "guid" },
58  { "id", CT_STRING, MAX_ID_LEN, COL_NNUL, NULL, JOB_ID },
59  { "name", CT_STRING, MAX_NAME_LEN, COL_NNUL, "name" },
60  { "reference", CT_STRING, MAX_REFERENCE_LEN, COL_NNUL, NULL, JOB_REFERENCE },
61  {
62  "active", CT_BOOLEAN, 0, COL_NNUL, NULL, NULL,
63  (QofAccessFunc)gncJobGetActive, (QofSetterFunc)gncJobSetActive
64  },
65  {
66  "owner", CT_OWNERREF, 0, 0, NULL, NULL,
67  (QofAccessFunc)gncJobGetOwner, (QofSetterFunc)gncJobSetOwner
68  },
69  { NULL }
70 };
71 
72 static GncJob*
73 load_single_job( GncSqlBackend* be, GncSqlRow* row )
74 {
75  const GncGUID* guid;
76  GncJob* pJob;
77 
78  g_return_val_if_fail( be != NULL, NULL );
79  g_return_val_if_fail( row != NULL, NULL );
80 
81  guid = gnc_sql_load_guid( be, row );
82  pJob = gncJobLookup( be->book, guid );
83  if ( pJob == NULL )
84  {
85  pJob = gncJobCreate( be->book );
86  }
87  gnc_sql_load_object( be, row, GNC_ID_JOB, pJob, col_table );
88  qof_instance_mark_clean( QOF_INSTANCE(pJob) );
89 
90  return pJob;
91 }
92 
93 static void
94 load_all_jobs( GncSqlBackend* be )
95 {
96  GncSqlStatement* stmt;
97  GncSqlResult* result;
98 
99  g_return_if_fail( be != NULL );
100 
101  stmt = gnc_sql_create_select_statement( be, TABLE_NAME );
102  result = gnc_sql_execute_select_statement( be, stmt );
103  gnc_sql_statement_dispose( stmt );
104  if ( result != NULL )
105  {
106  GncSqlRow* row;
107  GList* list = NULL;
108 
109  row = gnc_sql_result_get_first_row( result );
110  while ( row != NULL )
111  {
112  GncJob* pJob = load_single_job( be, row );
113  if ( pJob != NULL )
114  {
115  list = g_list_append( list, pJob );
116  }
117  row = gnc_sql_result_get_next_row( result );
118  }
119  gnc_sql_result_dispose( result );
120 
121  if ( list != NULL )
122  {
123  gnc_sql_slots_load_for_list( be, list );
124  g_list_free( list );
125  }
126  }
127 }
128 
129 /* ================================================================= */
130 static void
131 create_job_tables( GncSqlBackend* be )
132 {
133  gint version;
134 
135  g_return_if_fail( be != NULL );
136 
137  version = gnc_sql_get_table_version( be, TABLE_NAME );
138  if ( version == 0 )
139  {
140  gnc_sql_create_table( be, TABLE_NAME, TABLE_VERSION, col_table );
141  }
142 }
143 
144 /* ================================================================= */
145 static gboolean
146 save_job( GncSqlBackend* be, QofInstance* inst )
147 {
148  g_return_val_if_fail( inst != NULL, FALSE );
149  g_return_val_if_fail( GNC_IS_JOB(inst), FALSE );
150  g_return_val_if_fail( be != NULL, FALSE );
151 
152  return gnc_sql_commit_standard_item( be, inst, TABLE_NAME, GNC_ID_JOB, col_table );
153 }
154 
155 /* ================================================================= */
156 static gboolean
157 job_should_be_saved( GncJob *job )
158 {
159  const char *id;
160 
161  g_return_val_if_fail( job != NULL, FALSE );
162 
163  /* make sure this is a valid job before we save it -- should have an ID */
164  id = gncJobGetID( job );
165  if ( id == NULL || *id == '\0' )
166  {
167  return FALSE;
168  }
169 
170  return TRUE;
171 }
172 
173 static void
174 write_single_job( QofInstance *term_p, gpointer data_p )
175 {
176  write_objects_t* s = (write_objects_t*)data_p;
177 
178  g_return_if_fail( term_p != NULL );
179  g_return_if_fail( GNC_IS_JOB(term_p) );
180  g_return_if_fail( data_p != NULL );
181 
182  if ( s->is_ok && job_should_be_saved( GNC_JOB(term_p) ) )
183  {
184  s->is_ok = save_job( s->be, term_p );
185  }
186 }
187 
188 static gboolean
189 write_jobs( GncSqlBackend* be )
190 {
191  write_objects_t data;
192 
193  g_return_val_if_fail( be != NULL, FALSE );
194 
195  data.be = be;
196  data.is_ok = TRUE;
197  qof_object_foreach( GNC_ID_JOB, be->book, write_single_job, &data );
198 
199  return data.is_ok;
200 }
201 
202 /* ================================================================= */
203 void
204 gnc_job_sql_initialize( void )
205 {
206  static GncSqlObjectBackend be_data =
207  {
208  GNC_SQL_BACKEND_VERSION,
209  GNC_ID_JOB,
210  save_job, /* commit */
211  load_all_jobs, /* initial_load */
212  create_job_tables, /* create_tables */
213  NULL, NULL, NULL,
214  write_jobs /* write */
215  };
216 
217  qof_object_register_backend( GNC_ID_JOB, GNC_SQL_BACKEND, &be_data );
218 }
219 /* ========================== END OF FILE ===================== */
gboolean qof_object_register_backend(QofIdTypeConst type_name, const char *backend_name, gpointer be_data)
gint gnc_sql_get_table_version(const GncSqlBackend *be, const gchar *table_name)
#define G_LOG_DOMAIN
Functions providing the SX List as a plugin page.
load and save accounts data to SQL
GncSqlStatement * gnc_sql_create_select_statement(GncSqlBackend *be, const gchar *table_name)
#define COL_NNUL
gboolean gnc_sql_create_table(GncSqlBackend *be, const gchar *table_name, gint table_version, const GncSqlColumnTableEntry *col_table)
load and save data to SQL
gpointer(* QofAccessFunc)(gpointer object, const QofParam *param)
Definition: qofclass.h:177
QofBook * book
Definition: guid.h:65
#define COL_PKEY
const GncGUID * gnc_sql_load_guid(const GncSqlBackend *be, GncSqlRow *row)
load and save owner data to SQL
load and save job data to SQL
Definition: gncJob.c:41
void gnc_sql_slots_load_for_list(GncSqlBackend *be, GList *list)
void qof_object_foreach(QofIdTypeConst type_name, QofBook *book, QofInstanceForeachCB cb, gpointer user_data)
GncSqlResult * gnc_sql_execute_select_statement(GncSqlBackend *be, GncSqlStatement *stmt)
void gnc_sql_load_object(const GncSqlBackend *be, GncSqlRow *row, QofIdTypeConst obj_name, gpointer pObject, const GncSqlColumnTableEntry *table)
gboolean gnc_sql_commit_standard_item(GncSqlBackend *be, QofInstance *inst, const gchar *tableName, QofIdTypeConst obj_name, const GncSqlColumnTableEntry *col_table)
void(* QofSetterFunc)(gpointer, gpointer)
Definition: qofclass.h:184
const gchar * QofLogModule
Definition: qofid.h:89