00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00030 #include "config.h"
00031 #include <stdlib.h>
00032 #include <errno.h>
00033 #include "glib.h"
00034 #ifdef HAVE_GDA
00035 #include <sql/sql_parser.h>
00036 #else
00037 #include "sql_parser.h"
00038 #endif
00039 #include <time.h>
00040 #include "qof.h"
00041 #include "qofquery-p.h"
00042
00043 static QofLogModule log_module = QOF_MOD_QUERY;
00044
00045
00046
00047 struct _QofSqlQuery
00048 {
00049 sql_statement *parse_result;
00050 QofQuery *qof_query;
00051 QofBook *book;
00052 gchar *single_global_tablename;
00053 KvpFrame *kvp_join;
00054 GList *param_list;
00055 QofEntity *inserted_entity;
00056 };
00057
00058
00059
00060 QofSqlQuery *
00061 qof_sql_query_new (void)
00062 {
00063 QofSqlQuery *sqn = (QofSqlQuery *) g_new0 (QofSqlQuery, 1);
00064
00065 sqn->qof_query = NULL;
00066 sqn->parse_result = NULL;
00067 sqn->book = NULL;
00068 sqn->single_global_tablename = NULL;
00069 sqn->kvp_join = NULL;
00070
00071 return sqn;
00072 }
00073
00074
00075
00076 void
00077 qof_sql_query_destroy (QofSqlQuery * q)
00078 {
00079 if (!q)
00080 return;
00081 qof_query_destroy (q->qof_query);
00082 sql_destroy (q->parse_result);
00083 g_free (q);
00084 }
00085
00086
00087
00088 QofQuery *
00089 qof_sql_query_get_query (QofSqlQuery * q)
00090 {
00091 if (!q)
00092 return NULL;
00093 return q->qof_query;
00094 }
00095
00096
00097
00098 void
00099 qof_sql_query_set_book (QofSqlQuery * q, QofBook * book)
00100 {
00101 if (!q)
00102 return;
00103 q->book = book;
00104 }
00105
00106
00107
00108 void
00109 qof_sql_query_set_kvp (QofSqlQuery * q, KvpFrame * kvp)
00110 {
00111 if (!q)
00112 return;
00113 q->kvp_join = kvp;
00114 }
00115
00116
00117
00118 static inline void
00119 get_table_and_param (char *str, char **tab, char **param)
00120 {
00121 char *end = strchr (str, '.');
00122 if (!end)
00123 {
00124 *tab = 0;
00125 *param = str;
00126 return;
00127 }
00128 *end = 0;
00129 *tab = str;
00130 *param = end + 1;
00131 }
00132
00133 static inline char *
00134 dequote_string (char *str)
00135 {
00136 size_t len;
00137
00138 if (('\'' == str[0]) || ('\"' == str[0]))
00139 {
00140 str++;
00141 len = strlen (str);
00142 str[len - 1] = 0;
00143 }
00144 return str;
00145 }
00146
00147 static QofQuery *
00148 handle_single_condition (QofSqlQuery * query, sql_condition * cond)
00149 {
00150 char tmpbuff[128];
00151 GSList *param_list;
00152 GList *guid_list;
00153 QofQueryPredData *pred_data;
00154 sql_field_item *sparam, *svalue;
00155 gchar *qparam_name, *qvalue_name, *table_name, *param_name;
00156 gchar *sep, *path, *str, *p;
00157 QofQuery *qq;
00158 KvpValue *kv, *kval;
00159 KvpValueType kvt;
00160 QofQueryCompare qop;
00161 guint len;
00162 QofType param_type;
00163 QofGuidMatch gm;
00164
00165 pred_data = NULL;
00166 if (NULL == cond)
00167 {
00168 PWARN ("missing condition");
00169 return NULL;
00170 }
00171
00172
00173
00174 if (NULL == cond->d.pair.left)
00175 {
00176 PWARN ("missing left parameter");
00177 return NULL;
00178 }
00179 sparam = cond->d.pair.left->item;
00180 if (SQL_name != sparam->type)
00181 {
00182 PWARN ("we support only parameter names at this time (parsed %d)",
00183 sparam->type);
00184 return NULL;
00185 }
00186 qparam_name = sparam->d.name->data;
00187 if (NULL == qparam_name)
00188 {
00189 PWARN ("missing parameter name");
00190 return NULL;
00191 }
00192
00193
00194
00195
00196 if (NULL == cond->d.pair.right)
00197 {
00198 PWARN ("missing right parameter");
00199 return NULL;
00200 }
00201 svalue = cond->d.pair.right->item;
00202 if (SQL_name != svalue->type)
00203 {
00204 PWARN ("we support only simple values (parsed as %d)",
00205 svalue->type);
00206 return NULL;
00207 }
00208 qvalue_name = svalue->d.name->data;
00209 if (NULL == qvalue_name)
00210 {
00211 PWARN ("missing value");
00212 return NULL;
00213 }
00214 qvalue_name = dequote_string (qvalue_name);
00215 qvalue_name = (char *) qof_util_whitespace_filter (qvalue_name);
00216
00217
00218
00219 if (0 == strncasecmp (qvalue_name, "kvp://", 6))
00220 {
00221 if (NULL == query->kvp_join)
00222 {
00223 PWARN ("missing kvp frame");
00224 return NULL;
00225 }
00226 kv = kvp_frame_get_value (query->kvp_join, qvalue_name + 5);
00227
00228
00229 if (!kv)
00230 return NULL;
00231 kvt = kvp_value_get_type (kv);
00232
00233 tmpbuff[0] = 0x0;
00234 qvalue_name = tmpbuff;
00235 switch (kvt)
00236 {
00237 case KVP_TYPE_GINT64:
00238 {
00239 gint64 ival = kvp_value_get_gint64 (kv);
00240 sprintf (tmpbuff, "%" G_GINT64_FORMAT "\n", ival);
00241 b77fb">QofSqlQuery * query, sql_condition * cond)
00149 {
00150 char tmpbuff[128];
00151 GSList *param_list;
00152 GList *guid_list;
00153 QofQueryPredData *pred_data;
00154 sql_field_item *sparam, *svalue;
00155 gchar *qparam_name, *qvalue_name, *table_name, *param013c4mment"> * You should have received a c2literal">'2li/a>00153 QofQueryPredData *pred_data;
00154 sql_field_item *sparam,fterac24a6n cl12>00664 49bb26"\n",BINAname="name, *qvalue_nae="l00236"62(kv);
00240 sprintf (tmpbuff, "%" G_GINT64_FORMAf2d8bcom5c243af66ad18f6fss="6;, LISTme="name, *qvalue_na46167149686roup__Trace.html#g8ec4f6371dfe642d540f37f29f79a137">PWARN ("missing kvp frame");
9edc3f32b9fda1eb4f36c0bfc372ec/spa",NUMERIaram_name, *qvalue_na>0023864oup__Trace.html#g8ec4f6371dfe642d540f37f29f79a137">PWARN ("missing kvp frame");
c8392f94d3dfa8d11nam63109105943kvp_value_geFRAMss="keywordflow">ret4 if (SQL_name != svalue->type)
00203 {
0020unrdtyped ch6">kvp_value_ge;
00239 gint64 ival = 00230 /span> 00230 /e="l00153"6an class="prepr2n * cond)
270------------------------ */
00172 00150