QOF client-side SQL parser - interfaces with libgda. More...
#include "config.h"
#include <stdlib.h>
#include <errno.h>
#include <glib.h>
#include <libintl.h>
#include "sql_parser.h"
#include <time.h>
#include "qof.h"
#include "qofsql-p.h"
#include "qofquery-p.h"
Go to the source code of this file.
Defines | |
#define | _(String) dgettext (GETTEXT_PACKAGE, String) |
#define | QSQL_KVP_TABLE "sql_kvp" |
#define | END_DB_VERSION " dbversion int );" |
Typedefs | |
typedef struct ent_and_string | eas |
Functions | |
QofSqlQuery * | qof_sql_query_new (void) |
void | qof_sql_query_destroy (QofSqlQuery *q) |
QofQuery * | qof_sql_query_get_query (QofSqlQuery *q) |
void | qof_sql_query_set_book (QofSqlQuery *q, QofBook *book) |
void | qof_sql_query_set_kvp (QofSqlQuery *q, KvpFrame *kvp) |
static void | get_table_and_param (char *str, char **tab, char **param) |
static char * | dequote_string (char *str) |
static QofQuery * | handle_single_condition (QofSqlQuery *query, sql_condition *cond) |
static QofQuery * | handle_where (QofSqlQuery *query, sql_where *swear) |
static void | handle_sort_order (QofSqlQuery *query, GList *sorder_list) |
static void | qof_sql_insertCB (const QofParam *param, const gchar *insert_string, QofSqlQuery *query) |
static void | qof_query_set_insert_table (QofSqlQuery *query) |
static QofEntity * | qof_query_insert (QofSqlQuery *query) |
static const char * | sql_type_as_string (sql_statement_type type) |
void | qof_sql_query_parse (QofSqlQuery *query, const char *str) |
GList * | qof_sql_query_run (QofSqlQuery *query, const char *str) |
GList * | qof_sql_query_rerun (QofSqlQuery *query) |
static void | create_sql_from_param_cb (QofParam *param, gpointer user_data) |
static gchar * | string_param_to_sql (QofParam *param) |
static void | string_param_foreach (QofParam *param, gpointer user_data) |
static void | create_param_list (QofParam *param, gpointer user_data) |
list just the parameter names | |
static void | kvpvalue_to_sql_insert (const gchar *key, KvpValue *val, gpointer user_data) |
static void | kvpvalue_to_sql_update (const gchar *key, KvpValue *val, gpointer user_data) |
gchar * | qof_sql_object_create_table (QofObject *obj) |
Build a SQL 'CREATE' statement for this object. | |
gchar * | qof_sql_entity_create_table (QofEntity *ent) |
Build a SQL 'CREATE' statement for this entity. | |
gchar * | qof_sql_entity_insert (QofEntity *ent) |
Build a SQL 'INSERT' statement for this entity. | |
static void | collect_kvp (QofEntity *ent, gpointer user_data) |
gchar * | qof_sql_entity_update (QofEntity *ent) |
Build a SQL 'UPDATE' statement for the current entity parameter. | |
gchar * | qof_sql_entity_update_kvp (QofEntity *ent) |
Build a SQL 'UPDATE' statement for the KVP data in this entity. | |
gchar * | qof_sql_entity_update_list (QofEntity *ent, GList **params) |
Build a SQL 'UPDATE' statement for a list of parameters. | |
gchar * | qof_sql_entity_delete (QofEntity *ent) |
Build a SQL 'DELETE' statement for this entity. | |
gchar * | qof_sql_entity_drop_table (QofEntity *ent) |
Build a SQL 'DROP' statement for this entity type. | |
void | qof_sql_entity_set_kvp_tablename (const gchar *name) |
Set a default KVP table name for each backend. | |
void | qof_sql_entity_set_kvp_id (gulong id) |
Set the initial index value of the KVP table. | |
gulong | qof_sql_entity_get_kvp_id (void) |
Get the index value of the KVP table after the operation(s). | |
void | qof_sql_entity_set_kvp_exists (gboolean exist) |
Set or clear a flag that the KVP table exists or not. | |
Variables | |
static gchar * | kvp_table_name = NULL |
static QofLogModule | log_module = "qof-query" |
static gulong | kvp_id = 0 |
static gboolean | kvp_table_exists = FALSE |
QOF client-side SQL parser - interfaces with libgda.
Intended to parse incoming SQL into QOF queries (SELECT or INSERT) and prepare SQL commands from QOF entities (CREATE, UPDATE, INSERT, DELETE and DROP) for use in SQL-based backends.
Definition in file qofsql.c.
typedef struct ent_and_string eas |
simple helper struct for passing between SQL-generating functions
static void create_param_list | ( | QofParam * | param, | |
gpointer | user_data | |||
) | [static] |
list just the parameter names
Definition at line 1220 of file qofsql.c.
01221 { 01222 eas * data = (eas *)user_data; 01223 g_return_if_fail (data->str); 01224 /* avoid creating database fields for calculated values */ 01225 if (!param->param_setfcn) 01226 return; 01227 /* avoid setting KVP even if a param_setfcn has been set 01228 because a QofSetterFunc for KVP is quite pointless. */ 01229 if (0 == safe_strcmp (param->param_type, QOF_TYPE_KVP)) 01230 { 01231 PINFO (" kvp support tag"); 01232 return; 01233 } 01234 if (!g_str_has_suffix (data->str, "(")) 01235 { 01236 gchar *add; 01237 add = g_strconcat (data->str, ", ", param->param_name, NULL); 01238 g_free (data->str); 01239 data->str = add; 01240 } 01241 else 01242 { 01243 gchar * add; 01244 add = g_strjoin ("", data->str, param->param_name, NULL); 01245 g_free (data->str); 01246 data->str = add; 01247 } 01248 }
static void kvpvalue_to_sql_insert | ( | const gchar * | key, | |
KvpValue * | val, | |||
gpointer | user_data | |||
) | [static] |
returns the VALUES for INSERT in pre-defined order
Definition at line 1252 of file qofsql.c.
01253 { 01254 eas * data; 01255 KvpValueType n; 01256 gchar * path; 01257 01258 path = g_strdup(""); 01259 ENTER (" "); 01260 data = (eas*)user_data; 01261 g_return_if_fail (key && val && data); 01262 n = kvp_value_get_type (val); 01263 switch (n) 01264 { 01265 case KVP_TYPE_GINT64: 01266 case KVP_TYPE_DOUBLE: 01267 case KVP_TYPE_NUMERIC: 01268 case KVP_TYPE_STRING: 01269 case KVP_TYPE_GUID: 01270 case KVP_TYPE_TIME: 01271 case KVP_TYPE_BOOLEAN: 01272 { 01273 path = g_strjoin ("/", data->full_kvp_path, key, NULL); 01274 data->str = 01275 g_strdup_printf ("'%s', '%s', '%s'", key, path, 01276 kvp_value_to_bare_string (val)); 01277 DEBUG (" %s", data->str); 01278 break; 01279 } 01280 case KVP_TYPE_FRAME: 01281 { 01282 path = g_strjoin ("/", data->full_kvp_path, key, NULL); 01283 g_free (data->full_kvp_path); 01284 data->full_kvp_path = path; 01285 kvp_frame_for_each_slot (kvp_value_get_frame (val), 01286 kvpvalue_to_sql_insert, data); 01287 break; 01288 } 01289 default: 01290 { 01291 PERR (" unsupported value = %d", kvp_value_get_type (val)); 01292 break; 01293 } 01294 } 01295 LEAVE (" %s", data->str); 01296 }
static void kvpvalue_to_sql_update | ( | const gchar * | key, | |
KvpValue * | val, | |||
gpointer | user_data | |||
) | [static] |
returns the VALUES for UPDATE in pre-defined order
Definition at line 1300 of file qofsql.c.
01301 { 01302 eas * data; 01303 KvpValueType n; 01304 gchar * path; 01305 01306 ENTER (" key=%s", key); 01307 data = (eas*)user_data; 01308 g_return_if_fail (key && val && data); 01309 n = kvp_value_get_type (val); 01310 switch (n) 01311 { 01312 case KVP_TYPE_GINT64: 01313 case KVP_TYPE_DOUBLE: 01314 case KVP_TYPE_NUMERIC: 01315 case KVP_TYPE_STRING: 01316 case KVP_TYPE_GUID: 01317 case KVP_TYPE_TIME: 01318 case KVP_TYPE_BOOLEAN: 01319 { 01320 path = g_strjoin ("/", data->full_kvp_path, key, NULL); 01321 data->str = 01322 g_strdup_printf ("type='%s', value='%s' WHERE path='%s' and ", 01323 key, kvp_value_to_bare_string (val), path); 01324 DEBUG (" %s", data->str); 01325 break; 01326 } 01327 case KVP_TYPE_FRAME: 01328 { 01329 path = g_strjoin ("/", data->full_kvp_path, key, NULL); 01330 g_free (data->full_kvp_path); 01331 data->full_kvp_path = path; 01332 kvp_frame_for_each_slot (kvp_value_get_frame (val), 01333 kvpvalue_to_sql_update, data); 01334 break; 01335 } 01336 default: 01337 { 01338 PERR (" unsupported value = %d", kvp_value_get_type (val)); 01339 break; 01340 } 01341 } 01342 LEAVE (" %s", data->str); 01343 }
static gchar* string_param_to_sql | ( | QofParam * | param | ) | [static] |
Definition at line 1134 of file qofsql.c.
01135 { 01142 /* Handle the entity GUID. Ensure that reference GUIDs 01143 must not also try to be primary keys and can be NULL. */ 01144 if ((0 == safe_strcmp (param->param_type, QOF_TYPE_GUID)) && 01145 (0 == safe_strcmp (param->param_name, QOF_PARAM_GUID))) 01146 return g_strdup_printf (" %s char(32) primary key not null", 01147 param->param_name); 01148 if (0 == safe_strcmp (param->param_type, QOF_TYPE_GUID)) 01149 return g_strdup_printf (" %s char(32)", param->param_name); 01150 /* avoid creating database fields for calculated values */ 01151 if (!param->param_setfcn) 01152 return NULL; 01153 if (0 == safe_strcmp (param->param_type, QOF_TYPE_STRING)) 01154 return g_strdup_printf (" %s mediumtext", param->param_name); 01155 if (0 == safe_strcmp (param->param_type, QOF_TYPE_BOOLEAN)) 01156 return g_strdup_printf (" %s int", param->param_name); 01157 if ((0 == safe_strcmp (param->param_type, QOF_TYPE_NUMERIC)) 01158 || (0 == safe_strcmp (param->param_type, QOF_TYPE_DOUBLE)) 01159 || (0 == safe_strcmp (param->param_type, QOF_TYPE_DEBCRED))) 01160 { 01161 return g_strdup_printf (" %s text", param->param_name); 01162 } 01163 if (0 == safe_strcmp (param->param_type, QOF_TYPE_INT32)) 01164 return g_strdup_printf (" %s int", param->param_name); 01165 if (0 == safe_strcmp (param->param_type, QOF_TYPE_TIME)) 01166 return g_strdup_printf (" %s datetime", param->param_name); 01167 if (0 == safe_strcmp (param->param_type, QOF_TYPE_CHAR)) 01168 return g_strdup_printf (" %s char(1)", param->param_name); 01169 /* kvp data is stored separately - actually this is really 01170 a no-op because entities do not need a param_setfcn for kvp data. */ 01171 if (0 == safe_strcmp (param->param_type, QOF_TYPE_KVP)) 01172 return g_strdup (""); 01175 if (0 == safe_strcmp (param->param_type, QOF_TYPE_COLLECT)) 01176 return g_strdup (""); 01177 // return g_strdup_printf (" %s char(32)", param->param_name); 01178 /* catch references */ 01179 return g_strdup_printf (" %s char(32)", param->param_name); 01180 }
gchar* kvp_table_name = NULL [static] |