forked from Lainports/freebsd-ports
323 lines
8.4 KiB
C
323 lines
8.4 KiB
C
--- lib/qof/qofsql.c.orig Sun May 23 16:58:28 2004
|
|
+++ lib/qof/qofsql.c Thu Jul 8 00:11:24 2004
|
|
@@ -133,8 +133,9 @@
|
|
if (('\'' == str[0]) ||
|
|
('\"' == str[0]))
|
|
{
|
|
+ size_t len;
|
|
str ++;
|
|
- size_t len = strlen(str);
|
|
+ len = strlen(str);
|
|
str[len-1] = 0;
|
|
}
|
|
return str;
|
|
@@ -146,6 +147,15 @@
|
|
char tmpbuff[128];
|
|
GSList *param_list;
|
|
QofQueryPredData *pred_data = NULL;
|
|
+ sql_field_item * sparam;
|
|
+ char * qparam_name;
|
|
+ sql_field_item * svalue;
|
|
+ char * qvalue_name;
|
|
+ QofQueryCompare qop;
|
|
+ char *table_name;
|
|
+ char *param_name;
|
|
+ QofType param_type;
|
|
+ QofQuery *qq;
|
|
|
|
if (NULL == cond)
|
|
{
|
|
@@ -161,14 +171,14 @@
|
|
PWARN("missing left paramter");
|
|
return NULL;
|
|
}
|
|
- sql_field_item * sparam = cond->d.pair.left->item;
|
|
+ sparam = cond->d.pair.left->item;
|
|
if (SQL_name != sparam->type)
|
|
{
|
|
PWARN("we support only paramter names at this time (parsed %d)",
|
|
sparam->type);
|
|
return NULL;
|
|
}
|
|
- char * qparam_name = sparam->d.name->data;
|
|
+ qparam_name = sparam->d.name->data;
|
|
if (NULL == qparam_name)
|
|
{
|
|
PWARN ("missing paramter name");
|
|
@@ -183,13 +193,13 @@
|
|
PWARN ("missing right paramter");
|
|
return NULL;
|
|
}
|
|
- sql_field_item * svalue = cond->d.pair.right->item;
|
|
+ svalue = cond->d.pair.right->item;
|
|
if (SQL_name != svalue->type)
|
|
{
|
|
PWARN("we support only simple values (parsed as %d)", svalue->type);
|
|
return NULL;
|
|
}
|
|
- char * qvalue_name = svalue->d.name->data;
|
|
+ qvalue_name = svalue->d.name->data;
|
|
if (NULL == qvalue_name)
|
|
{
|
|
PWARN("missing value");
|
|
@@ -202,16 +212,18 @@
|
|
* If it is, look up the value. */
|
|
if (0 == strncasecmp (qvalue_name, "kvp://", 6))
|
|
{
|
|
+ KvpValue *kv;
|
|
+ KvpValueType kvt;
|
|
if (NULL == query->kvp_join)
|
|
{
|
|
PWARN ("missing kvp frame");
|
|
return NULL;
|
|
}
|
|
- KvpValue *kv = kvp_frame_get_value (query->kvp_join, qvalue_name+5);
|
|
+ kv = kvp_frame_get_value (query->kvp_join, qvalue_name+5);
|
|
/* If there's no value, its not an error;
|
|
* we just don't do this predicate */
|
|
if (!kv) return NULL;
|
|
- KvpValueType kvt = kvp_value_get_type (kv);
|
|
+ kvt = kvp_value_get_type (kv);
|
|
|
|
tmpbuff[0] = 0x0;
|
|
qvalue_name = tmpbuff;
|
|
@@ -251,7 +263,6 @@
|
|
param_list = qof_query_build_param_list (qparam_name, NULL);
|
|
|
|
/* Get the where-term comparison operator */
|
|
- QofQueryCompare qop;
|
|
switch (cond->op)
|
|
{
|
|
case SQL_eq: qop = QOF_COMPARE_EQUAL; break;
|
|
@@ -270,8 +281,6 @@
|
|
/* OK, need to know the type of the thing being matched
|
|
* in order to build the correct predicate. Get the type
|
|
* from the object parameters. */
|
|
- char *table_name;
|
|
- char *param_name;
|
|
get_table_and_param (qparam_name, &table_name, ¶m_name);
|
|
if (NULL == table_name)
|
|
{
|
|
@@ -290,7 +299,7 @@
|
|
return NULL;
|
|
}
|
|
|
|
- QofType param_type = qof_class_get_parameter_type (table_name, param_name);
|
|
+ param_type = qof_class_get_parameter_type (table_name, param_name);
|
|
if (!param_type)
|
|
{
|
|
PWARN ("The parameter \'%s\' on object \'%s\' is not known",
|
|
@@ -319,7 +328,7 @@
|
|
}
|
|
else if (!strcmp (param_type, QOF_TYPE_INT64))
|
|
{
|
|
- gint64 ival = atoll (qvalue_name);
|
|
+ gint64 ival = strtoll (qvalue_name, (char **)NULL, 10);
|
|
pred_data = qof_query_int64_predicate (qop, ival);
|
|
}
|
|
else if (!strcmp (param_type, QOF_TYPE_DOUBLE))
|
|
@@ -337,16 +346,17 @@
|
|
// XXX FIXME: this doesn't handle time strings, only date strings
|
|
// XXX should also see if we need to do a day-compare or time-compare.
|
|
/* work around highly bogus locale setting */
|
|
+ time_t exact;
|
|
+ int rc;
|
|
+ Timespec ts;
|
|
qof_date_format_set(QOF_DATE_FORMAT_US);
|
|
|
|
- time_t exact;
|
|
- int rc = qof_scan_date_secs (qvalue_name, &exact);
|
|
+ rc = qof_scan_date_secs (qvalue_name, &exact);
|
|
if (0 == rc)
|
|
{
|
|
PWARN ("unable to parse date: %s", qvalue_name);
|
|
return NULL;
|
|
}
|
|
- Timespec ts;
|
|
ts.tv_sec = exact;
|
|
ts.tv_nsec = 0;
|
|
pred_data = qof_query_date_predicate (qop, QOF_DATE_MATCH_DAY, ts);
|
|
@@ -367,7 +377,9 @@
|
|
else if (!strcmp (param_type, QOF_TYPE_GUID))
|
|
{
|
|
GUID guid;
|
|
+ QofGuidMatch gm;
|
|
gboolean rc = string_to_guid (qvalue_name, &guid);
|
|
+ GList *guid_list;
|
|
if (0 == rc)
|
|
{
|
|
PWARN ("unable to parse guid: %s", qvalue_name);
|
|
@@ -377,9 +389,9 @@
|
|
// XXX less, than greater than don't make sense,
|
|
// should check for those bad conditions
|
|
|
|
- QofGuidMatch gm = QOF_GUID_MATCH_ANY;
|
|
+ gm = QOF_GUID_MATCH_ANY;
|
|
if (QOF_COMPARE_NEQ == qop) gm = QOF_GUID_MATCH_NONE;
|
|
- GList *guid_list = g_list_append (NULL, &guid);
|
|
+ guid_list = g_list_append (NULL, &guid);
|
|
pred_data = qof_query_guid_predicate (gm, guid_list);
|
|
|
|
g_list_free (guid_list);
|
|
@@ -390,11 +402,15 @@
|
|
* /some/path/string:value
|
|
*/
|
|
char *sep = strchr (qvalue_name, ':');
|
|
+ char * path;
|
|
+ char * str;
|
|
+ char * p;
|
|
+ KvpValue *kval = NULL;
|
|
+ int len;
|
|
if (!sep) return NULL;
|
|
*sep = 0;
|
|
- char * path = qvalue_name;
|
|
- char * str = sep +1;
|
|
- char * p;
|
|
+ path = qvalue_name;
|
|
+ str = sep +1;
|
|
/* If str has only digits, we know its a plain number.
|
|
* If its numbers and a decimal point, assume a float
|
|
* If its numbers and a slash, assume numeric
|
|
@@ -402,8 +418,7 @@
|
|
* If it looks like an iso date ...
|
|
* else assume its a string.
|
|
*/
|
|
- KvpValue *kval = NULL;
|
|
- int len = strlen (str);
|
|
+ len = strlen (str);
|
|
if ((32 == len) && (32 == strspn (str, "0123456789abcdef")))
|
|
{
|
|
GUID guid;
|
|
@@ -413,7 +428,7 @@
|
|
else
|
|
if (len == strspn (str, "0123456789"))
|
|
{
|
|
- kval = kvp_value_new_gint64 (atoll(str));
|
|
+ kval = kvp_value_new_gint64 (strtoll(str, (char **)NULL, 10));
|
|
}
|
|
else
|
|
if ((p=strchr (str, '.')) &&
|
|
@@ -455,7 +470,7 @@
|
|
return NULL;
|
|
}
|
|
|
|
- QofQuery *qq = qof_query_create();
|
|
+ qq = qof_query_create();
|
|
qof_query_add_term (qq, param_list, pred_data, QOF_QUERY_FIRST_TERM);
|
|
return qq;
|
|
}
|
|
@@ -471,9 +486,10 @@
|
|
{
|
|
QofQuery *qleft = handle_where (query, swear->d.pair.left);
|
|
QofQuery *qright = handle_where (query, swear->d.pair.right);
|
|
+ QofQueryOp qop;
|
|
+ QofQuery * qq;
|
|
if (NULL == qleft) return qright;
|
|
if (NULL == qright) return qleft;
|
|
- QofQueryOp qop;
|
|
switch (swear->d.pair.op)
|
|
{
|
|
case SQL_and: qop = QOF_QUERY_AND; break;
|
|
@@ -484,7 +500,7 @@
|
|
qof_query_destroy (qright);
|
|
return NULL;
|
|
}
|
|
- QofQuery * qq = qof_query_merge (qleft, qright, qop);
|
|
+ qq = qof_query_merge (qleft, qright, qop);
|
|
qof_query_destroy (qleft);
|
|
qof_query_destroy (qright);
|
|
return qq;
|
|
@@ -511,11 +527,11 @@
|
|
static void
|
|
handle_sort_order (QofSqlQuery *query, GList *sorder_list)
|
|
{
|
|
- if (!sorder_list) return;
|
|
-
|
|
GSList *qsp[3];
|
|
gboolean direction[3];
|
|
int i;
|
|
+ if (!sorder_list) return;
|
|
+
|
|
|
|
for (i=0; i<3; i++)
|
|
{
|
|
@@ -524,14 +540,15 @@
|
|
|
|
if (sorder_list)
|
|
{
|
|
+ char * qparam_name = NULL;
|
|
+ GList *n;
|
|
sql_order_field *sorder = sorder_list->data;
|
|
|
|
/* Set the sort direction */
|
|
if (SQL_asc == sorder->order_type) direction[i] = TRUE;
|
|
|
|
/* Find the paramter name */
|
|
- char * qparam_name = NULL;
|
|
- GList *n = sorder->name;
|
|
+ n = sorder->name;
|
|
if (n)
|
|
{
|
|
qparam_name = n->data;
|
|
@@ -559,6 +576,9 @@
|
|
void
|
|
qof_sql_query_parse (QofSqlQuery *query, const char *str)
|
|
{
|
|
+ GList *tables;
|
|
+ sql_select_statement *sss;
|
|
+ sql_where * swear;
|
|
if (!query) return;
|
|
|
|
/* Delete old query, if any */
|
|
@@ -590,14 +610,14 @@
|
|
* user wrote "SELECT * FROM tableA, tableB WHERE ..."
|
|
* then we don't have a single unique table-name.
|
|
*/
|
|
- GList *tables = sql_statement_get_tables (query->parse_result);
|
|
+ tables = sql_statement_get_tables (query->parse_result);
|
|
if (1 == g_list_length (tables))
|
|
{
|
|
query->single_global_tablename = tables->data;
|
|
}
|
|
|
|
- sql_select_statement *sss = query->parse_result->statement;
|
|
- sql_where * swear = sss->where;
|
|
+ sss = query->parse_result->statement;
|
|
+ swear = sss->where;
|
|
if (swear)
|
|
{
|
|
/* Walk over the where terms, turn them into QOF predicates */
|
|
@@ -626,6 +646,7 @@
|
|
qof_sql_query_run (QofSqlQuery *query, const char *str)
|
|
{
|
|
GList *node;
|
|
+ GList *results;
|
|
|
|
if (!query) return NULL;
|
|
|
|
@@ -635,7 +656,7 @@
|
|
qof_query_set_book (query->qof_query, query->book);
|
|
|
|
// qof_query_print (query->qof_query);
|
|
- GList *results = qof_query_run (query->qof_query);
|
|
+ results = qof_query_run (query->qof_query);
|
|
|
|
return results;
|
|
}
|
|
@@ -644,6 +665,7 @@
|
|
qof_sql_query_rerun (QofSqlQuery *query)
|
|
{
|
|
GList *node;
|
|
+ GList *results;
|
|
|
|
if (!query) return NULL;
|
|
|
|
@@ -652,7 +674,7 @@
|
|
qof_query_set_book (query->qof_query, query->book);
|
|
|
|
// qof_query_print (query->qof_query);
|
|
- GList *results = qof_query_run (query->qof_query);
|
|
+ results = qof_query_run (query->qof_query);
|
|
|
|
return results;
|
|
}
|