GnuCash  2.6.99
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
gnc-backend-sql.h
Go to the documentation of this file.
1 /********************************************************************
2  * gnc-backend-sql.h: load and save data to SQL *
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 
39 #ifndef GNC_BACKEND_SQL_H
40 #define GNC_BACKEND_SQL_H
41 
42 #include "qof.h"
43 #include "qofbackend-p.h"
44 #include <gmodule.h>
45 
46 typedef struct GncSqlConnection GncSqlConnection;
47 
54 {
57  /*@ dependent @*/
59  gboolean loading;
60  gboolean in_query;
61  gboolean is_pristine_db;
62  gint obj_total;
64  GHashTable* versions;
65  const gchar* timespec_format;
66 };
67 typedef struct GncSqlBackend GncSqlBackend;
68 
75 
82 void gnc_sql_load( GncSqlBackend* be, /*@ dependent @*/ QofBook *book, QofBackendLoadType loadType );
83 
92  gpointer *comm);
93 
100 void gnc_sql_sync_all( GncSqlBackend* be, /*@ dependent @*/ QofBook *book );
101 
109 
117 
124 void gnc_sql_commit_edit( GncSqlBackend* qbe, QofInstance *inst );
125 
129 typedef struct GncSqlStatement GncSqlStatement;
130 typedef struct GncSqlResult GncSqlResult;
131 typedef struct GncSqlRow GncSqlRow;
132 
140 {
141  void (*dispose)( /*@ only @*/ GncSqlStatement* );
142  /*@ dependent @*/
143  gchar* (*toSql)( GncSqlStatement* );
144  void (*addWhereCond)( GncSqlStatement*, QofIdTypeConst, gpointer, const GncSqlColumnTableEntry*, GValue* );
145 };
146 #define gnc_sql_statement_dispose(STMT) \
147  (STMT)->dispose(STMT)
148 #define gnc_sql_statement_to_sql(STMT) \
149  (STMT)->toSql(STMT)
150 #define gnc_sql_statement_add_where_cond(STMT,TYPENAME,OBJ,COLDESC,VALUE) \
151  (STMT)->addWhereCond(STMT, TYPENAME, OBJ, COLDESC, VALUE)
152 
160 {
161  void (*dispose)( /*@ only @*/ GncSqlConnection* );
162  GncSqlResult* (*executeSelectStatement)( GncSqlConnection*, GncSqlStatement* );
164  GncSqlStatement* (*createStatementFromSql)( /*@ observer @*/ GncSqlConnection*, const gchar* );
165  gboolean (*doesTableExist)( GncSqlConnection*, const gchar* );
169  gboolean (*createTable)( GncSqlConnection*, const gchar*, GList* );
170  gboolean (*createIndex)( GncSqlConnection*, const gchar*, const gchar*, const GncSqlColumnTableEntry* );
171  gboolean (*addColumnsToTable)( GncSqlConnection*, const gchar* table, GList* );
172  gchar* (*quoteString)( const GncSqlConnection*, gchar* );
173 };
174 #define gnc_sql_connection_dispose(CONN) (CONN)->dispose(CONN)
175 #define gnc_sql_connection_execute_select_statement(CONN,STMT) \
176  (CONN)->executeSelectStatement(CONN,STMT)
177 #define gnc_sql_connection_execute_nonselect_statement(CONN,STMT) \
178  (CONN)->executeNonSelectStatement(CONN,STMT)
179 #define gnc_sql_connection_create_statement_from_sql(CONN,SQL) \
180  (CONN)->createStatementFromSql(CONN,SQL)
181 #define gnc_sql_connection_does_table_exist(CONN,NAME) \
182  (CONN)->doesTableExist(CONN,NAME)
183 #define gnc_sql_connection_begin_transaction(CONN) \
184  (CONN)->beginTransaction(CONN)
185 #define gnc_sql_connection_rollback_transaction(CONN) \
186  (CONN)->rollbackTransaction(CONN)
187 #define gnc_sql_connection_commit_transaction(CONN) \
188  (CONN)->commitTransaction(CONN)
189 #define gnc_sql_connection_create_table(CONN,NAME,COLLIST) \
190  (CONN)->createTable(CONN,NAME,COLLIST)
191 #define gnc_sql_connection_create_index(CONN,INDEXNAME,TABLENAME,COLTABLE) \
192  (CONN)->createIndex(CONN,INDEXNAME,TABLENAME,COLTABLE)
193 #define gnc_sql_connection_add_columns_to_table(CONN,TABLENAME,COLLIST) \
194  (CONN)->addColumnsToTable(CONN,TABLENAME,COLLIST)
195 #define gnc_sql_connection_quote_string(CONN,STR) \
196  (CONN)->quoteString(CONN,STR)
197 
204 struct GncSqlRow
205 {
206  const GValue* (*getValueAtColName)( GncSqlRow*, const gchar* );
207  void (*dispose)( /*@ only @*/ GncSqlRow* );
208 };
209 #define gnc_sql_row_get_value_at_col_name(ROW,N) \
210  (ROW)->getValueAtColName(ROW,N)
211 #define gnc_sql_row_dispose(ROW) \
212  (ROW)->dispose(ROW)
213 
221 {
222  guint (*getNumRows)( GncSqlResult* );
223  GncSqlRow* (*getFirstRow)( GncSqlResult* );
224  GncSqlRow* (*getNextRow)( GncSqlResult* );
225  void (*dispose)( /*@ only @*/ GncSqlResult* );
226 };
227 #define gnc_sql_result_get_num_rows(RESULT) \
228  (RESULT)->getNumRows(RESULT)
229 #define gnc_sql_result_get_first_row(RESULT) \
230  (RESULT)->getFirstRow(RESULT)
231 #define gnc_sql_result_get_next_row(RESULT) \
232  (RESULT)->getNextRow(RESULT)
233 #define gnc_sql_result_dispose(RESULT) \
234  (RESULT)->dispose(RESULT)
235 
250 typedef struct
251 {
252  int version;
253  const gchar * type_name;
257  /*@ null @*/
258  gboolean (*commit)( GncSqlBackend* be, QofInstance* inst );
260  /*@ null @*/
261  void (*initial_load)( GncSqlBackend* be );
263  /*@ null @*/
264  void (*create_tables)( GncSqlBackend* be );
266  /*@ null @*/
267  gpointer (*compile_query)( GncSqlBackend* be, QofQuery* pQuery );
269  /*@ null @*/
270  void (*run_query)( GncSqlBackend* be, gpointer pQuery );
272  /*@ null @*/
273  void (*free_query)( GncSqlBackend* be, gpointer pQuery );
277  /*@ null @*/
278  gboolean (*write)( GncSqlBackend* be );
280 #define GNC_SQL_BACKEND "gnc:sql:1"
281 #define GNC_SQL_BACKEND_VERSION 1
282 
286 typedef enum
287 {
288  BCT_STRING,
289  BCT_INT,
290  BCT_INT64,
291  BCT_DATE,
292  BCT_DOUBLE,
293  BCT_DATETIME
295 
302 typedef struct
303 {
304  /*@ only @*/ gchar* name;
306  gint size;
307  gboolean is_unicode;
308  gboolean is_autoinc;
309  gboolean is_primary_key;
310  gboolean null_allowed;
312 
313 // Type for conversion of db row to object.
314 #define CT_STRING "ct_string"
315 #define CT_GUID "ct_guid"
316 #define CT_INT "ct_int"
317 #define CT_INT64 "ct_int64"
318 #define CT_TIMESPEC "ct_timespec"
319 #define CT_GDATE "ct_gdate"
320 #define CT_NUMERIC "ct_numeric"
321 #define CT_DOUBLE "ct_double"
322 #define CT_BOOLEAN "ct_boolean"
323 #define CT_ACCOUNTREF "ct_accountref"
324 #define CT_BUDGETREF "ct_budgetref"
325 #define CT_COMMODITYREF "ct_commodityref"
326 #define CT_LOTREF "ct_lotref"
327 #define CT_TXREF "ct_txref"
328 
348 {
349  /*@ dependent @*/ const gchar* col_name;
350  const gchar* col_type;
351  gint size;
352 #define COL_PKEY 0x01
353 #define COL_NNUL 0x02
354 #define COL_UNIQUE 0x04
355 #define COL_AUTOINC 0x08
356  gint flags;
357  /*@ null @*/
358  const gchar* gobj_param_name;
359  /*@ null @*/
360  const gchar* qof_param_name;
361  /*@ null @*/
363  /*@ null @*/
365 };
366 
367 typedef enum
368 {
369  OP_DB_INSERT,
370  OP_DB_UPDATE,
371  OP_DB_DELETE
372 } E_DB_OPERATION;
373 
374 typedef void (*GNC_SQL_LOAD_FN)( const GncSqlBackend* be,
375  GncSqlRow* row,
376  /*@ null @*/ QofSetterFunc setter, gpointer pObject,
377  const GncSqlColumnTableEntry* table );
378 typedef void (*GNC_SQL_ADD_COL_INFO_TO_LIST_FN)( const GncSqlBackend* be,
379  const GncSqlColumnTableEntry* table_row,
380  GList** pList );
381 typedef void (*GNC_SQL_ADD_COLNAME_TO_LIST_FN)( const GncSqlColumnTableEntry* table_row, GList** pList );
382 typedef void (*GNC_SQL_ADD_GVALUE_TO_SLIST_FN)( const GncSqlBackend* be,
383  QofIdTypeConst obj_name, const gpointer pObject,
384  const GncSqlColumnTableEntry* table_row, GSList** pList );
385 
394 typedef struct
395 {
399  GNC_SQL_LOAD_FN load_fn;
400 
405  GNC_SQL_ADD_COL_INFO_TO_LIST_FN add_col_info_to_list_fn;
406 
410  GNC_SQL_ADD_COLNAME_TO_LIST_FN add_colname_to_list_fn;
411 
415  GNC_SQL_ADD_GVALUE_TO_SLIST_FN add_gvalue_to_slist_fn;
417 
425 /*@ null @*/
427 
435 void gnc_sql_add_colname_to_list( const GncSqlColumnTableEntry* table_row, GList** pList );
436 
449  E_DB_OPERATION op,
450  const gchar* table_name,
451  QofIdTypeConst obj_name,
452  gpointer pObject,
453  const GncSqlColumnTableEntry* table );
454 
464 /*@ null @*/
466 
476 /*@ null @*/
477 GncSqlResult* gnc_sql_execute_select_sql( GncSqlBackend* be, const gchar* sql );
478 
486 gint gnc_sql_execute_nonselect_sql( GncSqlBackend* be, const gchar* sql );
487 
495 /*@ null @*/
497 
507 void gnc_sql_load_object( const GncSqlBackend* be, GncSqlRow* row,
508  /*@ null @*/ QofIdTypeConst obj_name, gpointer pObject,
509  const GncSqlColumnTableEntry* table );
510 
522  const gchar* table_name,
523  QofIdTypeConst obj_name, const gpointer pObject,
524  const GncSqlColumnTableEntry* table );
525 
533 gint gnc_sql_get_table_version( const GncSqlBackend* be, const gchar* table_name );
534 
536  const gchar* table_name,
537  gint version );
538 
548 gboolean gnc_sql_create_table( GncSqlBackend* be,
549  const gchar* table_name,
550  gint table_version,
551  const GncSqlColumnTableEntry* col_table );
552 
562 gboolean gnc_sql_create_temp_table( const GncSqlBackend* be,
563  const gchar* table_name,
564  const GncSqlColumnTableEntry* col_table );
565 
575 gboolean gnc_sql_create_index( const GncSqlBackend* be, const gchar* index_name,
576  const gchar* table_name, const GncSqlColumnTableEntry* col_table );
577 
586 /*@ dependent @*//*@ null @*/
587 const GncGUID* gnc_sql_load_guid( const GncSqlBackend* be, GncSqlRow* row );
588 
597 /*@ dependent @*//*@ null @*/
598 const GncGUID* gnc_sql_load_tx_guid( const GncSqlBackend* be, GncSqlRow* row );
599 
607 /*@ null @*/
609  const gchar* table_name );
610 
617 void gnc_sql_register_col_type_handler( const gchar* colType, const GncSqlColumnTypeHandler* handler );
618 
629  QofIdTypeConst obj_name, const gpointer pObject,
630  const GncSqlColumnTableEntry* table_row, GSList** pList );
631 
641  const GncSqlColumnTableEntry* table_row, GList** pList );
642 
651 guint gnc_sql_append_guid_list_to_sql( GString* str, GList* list, guint maxCount );
652 
661  const GncSqlColumnTableEntry* subtable,
662  GList** pList );
663 
672 gchar* gnc_sql_get_sql_value( const GncSqlConnection* conn, const GValue* value );
673 
680 
687 
699 gboolean gnc_sql_commit_standard_item( GncSqlBackend* be, QofInstance* inst, const gchar* tableName,
700  QofIdTypeConst obj_name, const GncSqlColumnTableEntry* col_table );
701 
708 gint64 gnc_sql_get_integer_value( const GValue* value );
709 
718 
729 void gnc_sql_upgrade_table( GncSqlBackend* be, const gchar* table_name,
730  const GncSqlColumnTableEntry* col_table );
731 
740 gboolean gnc_sql_add_columns_to_table( GncSqlBackend* be, const gchar* table_name,
741  const GncSqlColumnTableEntry* new_col_table );
742 
750 void gnc_sql_set_load_order( const gchar** load_order );
751 
752 void _retrieve_guid_( gpointer pObject, /*@ null @*/ gpointer pValue );
753 
754 /*@ null @*/
755 gpointer gnc_sql_compile_query( QofBackend* pBEnd, QofQuery* pQuery );
756 void gnc_sql_free_query( QofBackend* pBEnd, gpointer pQuery );
757 void gnc_sql_run_query( QofBackend* pBEnd, gpointer pQuery );
758 
759 typedef struct
760 {
761  /*@ dependent @*/ GncSqlBackend* be;
762  gboolean is_ok;
764 
765 #endif /* GNC_BACKEND_SQL_H */
766 
const gchar * qof_param_name
gboolean gnc_sql_object_is_it_in_db(GncSqlBackend *be, const gchar *table_name, QofIdTypeConst obj_name, const gpointer pObject, const GncSqlColumnTableEntry *table)
void gnc_sql_begin_edit(GncSqlBackend *be, QofInstance *inst)
void gnc_sql_finalize_version_info(GncSqlBackend *be)
gint gnc_sql_get_table_version(const GncSqlBackend *be, const gchar *table_name)
gboolean loading
GHashTable * versions
GNC_SQL_ADD_GVALUE_TO_SLIST_FN add_gvalue_to_slist_fn
QofAccessFunc gnc_sql_get_getter(QofIdTypeConst obj_name, const GncSqlColumnTableEntry *table_row)
void gnc_sql_rollback_edit(GncSqlBackend *qbe, QofInstance *inst)
void gnc_sql_upgrade_table(GncSqlBackend *be, const gchar *table_name, const GncSqlColumnTableEntry *col_table)
const GncGUID * gnc_sql_load_tx_guid(const GncSqlBackend *be, GncSqlRow *row)
void gnc_sql_add_colname_to_list(const GncSqlColumnTableEntry *table_row, GList **pList)
void gnc_sql_init(GncSqlBackend *be)
const gchar * QofIdTypeConst
Definition: qofid.h:87
GncSqlStatement * gnc_sql_create_select_statement(GncSqlBackend *be, const gchar *table_name)
gboolean(* doesTableExist)(GncSqlConnection *, const gchar *)
gint gnc_sql_execute_nonselect_sql(GncSqlBackend *be, const gchar *sql)
gboolean gnc_sql_create_table(GncSqlBackend *be, const gchar *table_name, gint table_version, const GncSqlColumnTableEntry *col_table)
void gnc_sql_register_col_type_handler(const gchar *colType, const GncSqlColumnTypeHandler *handler)
Use a 64-bit unsigned int timespec.
Definition: gnc-date.h:299
GncSqlConnection * conn
gboolean gnc_sql_add_columns_to_table(GncSqlBackend *be, const gchar *table_name, const GncSqlColumnTableEntry *new_col_table)
QofBackend be
void gnc_sql_add_objectref_guid_col_info_to_list(const GncSqlBackend *be, const GncSqlColumnTableEntry *table_row, GList **pList)
gboolean in_query
gpointer(* QofAccessFunc)(gpointer object, const QofParam *param)
Definition: qofclass.h:177
struct _QofQuery QofQuery
Definition: qofquery.h:90
gint64 gnc_sql_get_integer_value(const GValue *value)
QofBook * book
Definition: guid.h:65
gboolean gnc_sql_create_index(const GncSqlBackend *be, const gchar *index_name, const gchar *table_name, const GncSqlColumnTableEntry *col_table)
const GncGUID * gnc_sql_load_guid(const GncSqlBackend *be, GncSqlRow *row)
gboolean(* addColumnsToTable)(GncSqlConnection *, const gchar *table, GList *)
GncSqlBasicColumnType type
void gnc_sql_set_load_order(const gchar **load_order)
guint gnc_sql_append_guid_list_to_sql(GString *str, GList *list, guint maxCount)
gboolean gnc_sql_set_table_version(GncSqlBackend *be, const gchar *table_name, gint version)
void gnc_sql_add_gvalue_objectref_guid_to_slist(const GncSqlBackend *be, QofIdTypeConst obj_name, const gpointer pObject, const GncSqlColumnTableEntry *table_row, GSList **pList)
gchar * gnc_sql_get_sql_value(const GncSqlConnection *conn, const GValue *value)
gboolean(* createIndex)(GncSqlConnection *, const gchar *, const gchar *, const GncSqlColumnTableEntry *)
GNC_SQL_ADD_COL_INFO_TO_LIST_FN add_col_info_to_list_fn
GncSqlResult * gnc_sql_execute_select_statement(GncSqlBackend *be, GncSqlStatement *statement)
void gnc_sql_load_object(const GncSqlBackend *be, GncSqlRow *row, QofIdTypeConst obj_name, gpointer pObject, const GncSqlColumnTableEntry *table)
const gchar * gobj_param_name
void gnc_sql_push_commodity_for_postload_processing(GncSqlBackend *be, gpointer *comm)
GNC_SQL_ADD_COLNAME_TO_LIST_FN add_colname_to_list_fn
gboolean gnc_sql_create_temp_table(const GncSqlBackend *be, const gchar *table_name, const GncSqlColumnTableEntry *col_table)
GncSqlBasicColumnType
void gnc_sql_commit_edit(GncSqlBackend *qbe, QofInstance *inst)
gboolean(* createTable)(GncSqlConnection *, const gchar *, GList *)
private api for data storage backend
void gnc_sql_sync_all(GncSqlBackend *be, QofBook *book)
gint(* executeNonSelectStatement)(GncSqlConnection *, GncSqlStatement *)
const gchar * type_name
gboolean gnc_sql_commit_standard_item(GncSqlBackend *be, QofInstance *inst, const gchar *tableName, QofIdTypeConst obj_name, const GncSqlColumnTableEntry *col_table)
gboolean is_pristine_db
void(* QofSetterFunc)(gpointer, gpointer)
Definition: qofclass.h:184
gboolean(* rollbackTransaction)(GncSqlConnection *)
gboolean gnc_sql_do_db_operation(GncSqlBackend *be, E_DB_OPERATION op, const gchar *table_name, QofIdTypeConst obj_name, gpointer pObject, const GncSqlColumnTableEntry *table)
GncSqlStatement * gnc_sql_create_statement_from_sql(GncSqlBackend *be, const gchar *sql)
const gchar * timespec_format
gboolean(* beginTransaction)(GncSqlConnection *)
gboolean(* commitTransaction)(GncSqlConnection *)
void gnc_sql_init_version_info(GncSqlBackend *be)
void gnc_sql_add_subtable_colnames_to_list(const GncSqlColumnTableEntry *table_row, const GncSqlColumnTableEntry *subtable, GList **pList)
void gnc_sql_load(GncSqlBackend *be, QofBook *book, QofBackendLoadType loadType)
GncSqlResult * gnc_sql_execute_select_sql(GncSqlBackend *be, const gchar *sql)
gchar * gnc_sql_convert_timespec_to_string(const GncSqlBackend *be, Timespec ts)