GnuCash  2.6.99
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
gnc-address-sql.c
Go to the documentation of this file.
1 /********************************************************************\
2  * gnc-address-sql.c -- address sql backend implementation *
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-engine.h"
38 
39 #include "gncAddress.h"
40 
41 #include "gnc-backend-sql.h"
42 #include "gnc-address-sql.h"
43 
44 G_GNUC_UNUSED static QofLogModule log_module = G_LOG_DOMAIN;
45 
46 #define ADDRESS_MAX_NAME_LEN 1024
47 #define ADDRESS_MAX_ADDRESS_LINE_LEN 1024
48 #define ADDRESS_MAX_PHONE_LEN 128
49 #define ADDRESS_MAX_FAX_LEN 128
50 #define ADDRESS_MAX_EMAIL_LEN 256
51 
52 static GncSqlColumnTableEntry col_table[] =
53 {
54  { "name", CT_STRING, ADDRESS_MAX_NAME_LEN, COL_NNUL, "name" },
55  { "addr1", CT_STRING, ADDRESS_MAX_ADDRESS_LINE_LEN, COL_NNUL, "addr1" },
56  { "addr2", CT_STRING, ADDRESS_MAX_ADDRESS_LINE_LEN, COL_NNUL, "addr2" },
57  { "addr3", CT_STRING, ADDRESS_MAX_ADDRESS_LINE_LEN, COL_NNUL, "addr3" },
58  { "addr4", CT_STRING, ADDRESS_MAX_ADDRESS_LINE_LEN, COL_NNUL, "addr4" },
59  { "phone", CT_STRING, ADDRESS_MAX_PHONE_LEN, COL_NNUL, "phone" },
60  { "fax", CT_STRING, ADDRESS_MAX_FAX_LEN, COL_NNUL, "fax" },
61  { "email", CT_STRING, ADDRESS_MAX_EMAIL_LEN, COL_NNUL, "email" },
62  { NULL }
63 };
64 
65 typedef void (*AddressSetterFunc)( gpointer, GncAddress* );
66 typedef GncAddress* (*AddressGetterFunc)( const gpointer );
67 
68 static void
69 load_address( const GncSqlBackend* be, GncSqlRow* row,
70  QofSetterFunc setter, gpointer pObject,
71  const GncSqlColumnTableEntry* table_row )
72 {
73  const GValue* val;
74  gchar* buf;
75  GncAddress* addr;
76  AddressSetterFunc a_setter = (AddressSetterFunc)setter;
77  const GncSqlColumnTableEntry* subtable;
78  const gchar* s;
79 
80  g_return_if_fail( be != NULL );
81  g_return_if_fail( row != NULL );
82  g_return_if_fail( pObject != NULL );
83  g_return_if_fail( table_row != NULL );
84 
85  addr = gncAddressCreate( be->book, NULL );
86  for ( subtable = col_table; subtable->col_name != NULL; subtable++ )
87  {
88  buf = g_strdup_printf( "%s_%s", table_row->col_name, subtable->col_name );
89  val = gnc_sql_row_get_value_at_col_name( row, buf );
90  g_free( buf );
91  if ( val == NULL )
92  {
93  s = NULL;
94  }
95  else
96  {
97  s = g_value_get_string( val );
98  }
99  if ( subtable->gobj_param_name != NULL )
100  {
101  g_object_set( addr, subtable->gobj_param_name, s, NULL );
102  }
103  else
104  {
105  if ( subtable->qof_param_name != NULL )
106  {
107  setter = qof_class_get_parameter_setter( GNC_ID_ADDRESS, subtable->qof_param_name );
108  }
109  else
110  {
111  setter = subtable->setter;
112  }
113  (*setter)( addr, (const gpointer)s );
114  }
115  }
116  if ( table_row->gobj_param_name != NULL )
117  {
118  qof_instance_increase_editlevel (pObject);
119  g_object_set( pObject, table_row->gobj_param_name, addr, NULL );
120  qof_instance_decrease_editlevel (pObject);
121  }
122  else
123  {
124  (*a_setter)( pObject, addr );
125  }
126 }
127 
128 static void
129 add_address_col_info_to_list( const GncSqlBackend* be, const GncSqlColumnTableEntry* table_row,
130  GList** pList )
131 {
132  GncSqlColumnInfo* info;
133  gchar* buf;
134  const GncSqlColumnTableEntry* subtable_row;
135 
136  g_return_if_fail( be != NULL );
137  g_return_if_fail( table_row != NULL );
138  g_return_if_fail( pList != NULL );
139 
140  for ( subtable_row = col_table; subtable_row->col_name != NULL; subtable_row++ )
141  {
142  buf = g_strdup_printf( "%s_%s", table_row->col_name, subtable_row->col_name );
143  info = g_new0( GncSqlColumnInfo, 1 );
144  info->name = buf;
145  info->type = BCT_STRING;
146  info->size = subtable_row->size;
147  info->is_primary_key = (table_row->flags & COL_PKEY) ? TRUE : FALSE;
148  info->null_allowed = (table_row->flags & COL_NNUL) ? FALSE : TRUE;
149  info->is_unicode = TRUE;
150  *pList = g_list_append( *pList, info );
151  }
152 }
153 
154 static void
155 add_address_colname_to_list( const GncSqlColumnTableEntry* table_row, GList** pList )
156 {
157  gnc_sql_add_subtable_colnames_to_list( table_row, col_table, pList );
158 }
159 
160 static void
161 get_gvalue_address( const GncSqlBackend* be, QofIdTypeConst obj_name, const gpointer pObject,
162  const GncSqlColumnTableEntry* table_row, GValue* value )
163 {
164  AddressGetterFunc getter;
165  GncAddress* addr;
166 
167  g_return_if_fail( be != NULL );
168  g_return_if_fail( obj_name != NULL );
169  g_return_if_fail( pObject != NULL );
170  g_return_if_fail( table_row != NULL );
171  g_return_if_fail( value != NULL );
172 
173  memset( value, 0, sizeof( GValue ) );
174  if ( table_row->gobj_param_name != NULL )
175  {
176  g_object_get( pObject, table_row->gobj_param_name, &addr, NULL );
177  }
178  else
179  {
180  getter = (AddressGetterFunc)gnc_sql_get_getter( obj_name, table_row );
181  addr = (*getter)( pObject );
182  }
183  g_value_init( value, gnc_address_get_type() );
184  g_value_set_object( value, addr );
185 }
186 
187 static void
188 add_gvalue_address_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
189  const gpointer pObject, const GncSqlColumnTableEntry* table_row, GSList** pList )
190 {
191  GValue value;
192  GValue* subfield_value;
193  GncAddress* addr;
194  gchar* s;
195  QofAccessFunc getter;
196  const GncSqlColumnTableEntry* subtable_row;
197 
198  g_return_if_fail( be != NULL );
199  g_return_if_fail( obj_name != NULL );
200  g_return_if_fail( pObject != NULL );
201  g_return_if_fail( table_row != NULL );
202 
203  memset( &value, 0, sizeof( GValue ) );
204  get_gvalue_address( be, obj_name, pObject, table_row, &value );
205 
206  if ( G_VALUE_TYPE(&value) != 0 )
207  {
208  addr = g_value_get_object( &value );
209  for ( subtable_row = col_table; subtable_row->col_name != NULL; subtable_row++ )
210  {
211  subfield_value = g_new0( GValue, 1 );
212  if ( subtable_row->gobj_param_name != NULL )
213  {
214  g_object_get( addr, subtable_row->gobj_param_name, &s, NULL );
215  }
216  else
217  {
218  getter = gnc_sql_get_getter( GNC_ID_ADDRESS, subtable_row );
219  s = (gchar*)(*getter)( addr, NULL );
220  }
221  g_value_init( subfield_value, G_TYPE_STRING );
222  if ( s )
223  {
224  g_value_set_string( subfield_value, s );
225  }
226  else
227  {
228  g_value_set_string( subfield_value, "NULL" );
229  }
230  (*pList) = g_slist_append( (*pList), subfield_value );
231  }
232  }
233 }
234 
235 static GncSqlColumnTypeHandler address_handler
236 = { load_address,
237  add_address_col_info_to_list,
238  add_address_colname_to_list,
239  add_gvalue_address_to_slist
240  };
241 
242 /* ================================================================= */
243 void
244 gnc_address_sql_initialize( void )
245 {
246  gnc_sql_register_col_type_handler( CT_ADDRESS, &address_handler );
247 }
248 /* ========================== END OF FILE ===================== */
const gchar * qof_param_name
QofAccessFunc gnc_sql_get_getter(QofIdTypeConst obj_name, const GncSqlColumnTableEntry *table_row)
#define G_LOG_DOMAIN
Functions providing the SX List as a plugin page.
const gchar * QofIdTypeConst
Definition: qofid.h:87
#define COL_NNUL
load and save data to SQL
void gnc_sql_register_col_type_handler(const gchar *colType, const GncSqlColumnTypeHandler *handler)
gpointer(* QofAccessFunc)(gpointer object, const QofParam *param)
Definition: qofclass.h:177
QofBook * book
#define COL_PKEY
GncSqlBasicColumnType type
All type declarations for the whole Gnucash engine.
const gchar * gobj_param_name
load and save address data to SQL
void(* QofSetterFunc)(gpointer, gpointer)
Definition: qofclass.h:184
an Address object
QofSetterFunc qof_class_get_parameter_setter(QofIdTypeConst obj_name, const char *parameter)
void gnc_sql_add_subtable_colnames_to_list(const GncSqlColumnTableEntry *table_row, const GncSqlColumnTableEntry *subtable, GList **pList)
const gchar * QofLogModule
Definition: qofid.h:89