|
GnuCash 2.4.99
|
00001 /********************************************************************\ 00002 * gnc-job-sql.c -- job sql backend * 00003 * * 00004 * This program is free software; you can redistribute it and/or * 00005 * modify it under the terms of the GNU General Public License as * 00006 * published by the Free Software Foundation; either version 2 of * 00007 * the License, or (at your option) any later version. * 00008 * * 00009 * This program is distributed in the hope that it will be useful, * 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00012 * GNU General Public License for more details. * 00013 * * 00014 * You should have received a copy of the GNU General Public License* 00015 * along with this program; if not, contact: * 00016 * * 00017 * Free Software Foundation Voice: +1-617-542-5942 * 00018 * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 * 00019 * Boston, MA 02110-1301, USA gnu@gnu.org * 00020 * * 00021 \********************************************************************/ 00022 00031 #include "config.h" 00032 00033 #include <glib.h> 00034 #include <stdlib.h> 00035 #include <string.h> 00036 00037 #include "gnc-backend-sql.h" 00038 #include "gnc-slots-sql.h" 00039 00040 #include "gncJobP.h" 00041 #include "gnc-job-sql.h" 00042 #include "gnc-owner-sql.h" 00043 00044 #define _GNC_MOD_NAME GNC_ID_JOB 00045 00046 static QofLogModule log_module = G_LOG_DOMAIN; 00047 00048 #define TABLE_NAME "jobs" 00049 #define TABLE_VERSION 1 00050 00051 #define MAX_ID_LEN 2048 00052 #define MAX_NAME_LEN 2048 00053 #define MAX_REFERENCE_LEN 2048 00054 00055 static GncSqlColumnTableEntry col_table[] = 00056 { 00057 { "guid", CT_GUID, 0, COL_NNUL | COL_PKEY, "guid" }, 00058 { "id", CT_STRING, MAX_ID_LEN, COL_NNUL, NULL, JOB_ID }, 00059 { "name", CT_STRING, MAX_NAME_LEN, COL_NNUL, "name" }, 00060 { "reference", CT_STRING, MAX_REFERENCE_LEN, COL_NNUL, NULL, JOB_REFERENCE }, 00061 { 00062 "active", CT_BOOLEAN, 0, COL_NNUL, NULL, NULL, 00063 (QofAccessFunc)gncJobGetActive, (QofSetterFunc)gncJobSetActive 00064 }, 00065 { 00066 "owner", CT_OWNERREF, 0, 0, NULL, NULL, 00067 (QofAccessFunc)gncJobGetOwner, (QofSetterFunc)gncJobSetOwner 00068 }, 00069 { NULL } 00070 }; 00071 00072 static GncJob* 00073 load_single_job( GncSqlBackend* be, GncSqlRow* row ) 00074 { 00075 const GncGUID* guid; 00076 GncJob* pJob; 00077 00078 g_return_val_if_fail( be != NULL, NULL ); 00079 g_return_val_if_fail( row != NULL, NULL ); 00080 00081 guid = gnc_sql_load_guid( be, row ); 00082 pJob = gncJobLookup( be->book, guid ); 00083 if ( pJob == NULL ) 00084 { 00085 pJob = gncJobCreate( be->book ); 00086 } 00087 gnc_sql_load_object( be, row, GNC_ID_JOB, pJob, col_table ); 00088 qof_instance_mark_clean( QOF_INSTANCE(pJob) ); 00089 00090 return pJob; 00091 } 00092 00093 static void 00094 load_all_jobs( GncSqlBackend* be ) 00095 { 00096 GncSqlStatement* stmt; 00097 GncSqlResult* result; 00098 QofBook* pBook; 00099 00100 g_return_if_fail( be != NULL ); 00101 00102 pBook = be->book; 00103 00104 stmt = gnc_sql_create_select_statement( be, TABLE_NAME ); 00105 result = gnc_sql_execute_select_statement( be, stmt ); 00106 gnc_sql_statement_dispose( stmt ); 00107 if ( result != NULL ) 00108 { 00109 GncSqlRow* row; 00110 GList* list = NULL; 00111 00112 row = gnc_sql_result_get_first_row( result ); 00113 while ( row != NULL ) 00114 { 00115 GncJob* pJob = load_single_job( be, row ); 00116 if ( pJob != NULL ) 00117 { 00118 list = g_list_append( list, pJob ); 00119 } 00120 row = gnc_sql_result_get_next_row( result ); 00121 } 00122 gnc_sql_result_dispose( result ); 00123 00124 if ( list != NULL ) 00125 { 00126 gnc_sql_slots_load_for_list( be, list ); 00127 g_list_free( list ); 00128 } 00129 } 00130 } 00131 00132 /* ================================================================= */ 00133 static void 00134 create_job_tables( GncSqlBackend* be ) 00135 { 00136 gint version; 00137 00138 g_return_if_fail( be != NULL ); 00139 00140 version = gnc_sql_get_table_version( be, TABLE_NAME ); 00141 if ( version == 0 ) 00142 { 00143 gnc_sql_create_table( be, TABLE_NAME, TABLE_VERSION, col_table ); 00144 } 00145 } 00146 00147 /* ================================================================= */ 00148 static gboolean 00149 save_job( GncSqlBackend* be, QofInstance* inst ) 00150 { 00151 g_return_val_if_fail( inst != NULL, FALSE ); 00152 g_return_val_if_fail( GNC_IS_JOB(inst), FALSE ); 00153 g_return_val_if_fail( be != NULL, FALSE ); 00154 00155 return gnc_sql_commit_standard_item( be, inst, TABLE_NAME, GNC_ID_JOB, col_table ); 00156 } 00157 00158 /* ================================================================= */ 00159 static gboolean 00160 job_should_be_saved( GncJob *job ) 00161 { 00162 const char *id; 00163 00164 g_return_val_if_fail( job != NULL, FALSE ); 00165 00166 /* make sure this is a valid job before we save it -- should have an ID */ 00167 id = gncJobGetID( job ); 00168 if ( id == NULL || *id == '\0' ) 00169 { 00170 return FALSE; 00171 } 00172 00173 return TRUE; 00174 } 00175 00176 static void 00177 write_single_job( QofInstance *term_p, gpointer data_p ) 00178 { 00179 write_objects_t* s = (write_objects_t*)data_p; 00180 00181 g_return_if_fail( term_p != NULL ); 00182 g_return_if_fail( GNC_IS_JOB(term_p) ); 00183 g_return_if_fail( data_p != NULL ); 00184 00185 if ( s->is_ok && job_should_be_saved( GNC_JOB(term_p) ) ) 00186 { 00187 s->is_ok = save_job( s->be, term_p ); 00188 } 00189 } 00190 00191 static gboolean 00192 write_jobs( GncSqlBackend* be ) 00193 { 00194 write_objects_t data; 00195 00196 g_return_val_if_fail( be != NULL, FALSE ); 00197 00198 data.be = be; 00199 data.is_ok = TRUE; 00200 qof_object_foreach( GNC_ID_JOB, be->book, write_single_job, &data ); 00201 00202 return data.is_ok; 00203 } 00204 00205 /* ================================================================= */ 00206 void 00207 gnc_job_sql_initialize( void ) 00208 { 00209 static GncSqlObjectBackend be_data = 00210 { 00211 GNC_SQL_BACKEND_VERSION, 00212 GNC_ID_JOB, 00213 save_job, /* commit */ 00214 load_all_jobs, /* initial_load */ 00215 create_job_tables, /* create_tables */ 00216 NULL, NULL, NULL, 00217 write_jobs /* write */ 00218 }; 00219 00220 qof_object_register_backend( GNC_ID_JOB, GNC_SQL_BACKEND, &be_data ); 00221 } 00222 /* ========================== END OF FILE ===================== */
1.7.4