GnuCash 2.4.99
gnc-job-sql.c
Go to the documentation of this file.
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 ===================== */
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines