[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
gnue/geas/src/oql oql.c
From: |
Daniel E. Baumann |
Subject: |
gnue/geas/src/oql oql.c |
Date: |
Tue, 05 Jun 2001 11:50:23 -0700 |
CVSROOT: /cvs
Module name: gnue
Changes by: Daniel E. Baumann <address@hidden> 01/06/05 11:50:22
Modified files:
geas/src/oql : oql.c
Log message:
Reformat code and add function headers.
CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/geas/src/oql/oql.c.diff?cvsroot=OldCVS&tr1=1.55&tr2=1.56&r1=text&r2=text
Patches:
Index: gnue/geas/src/oql/oql.c
diff -u gnue/geas/src/oql/oql.c:1.55 gnue/geas/src/oql/oql.c:1.56
--- gnue/geas/src/oql/oql.c:1.55 Fri Jun 1 17:24:34 2001
+++ gnue/geas/src/oql/oql.c Tue Jun 5 11:50:22 2001
@@ -1,29 +1,28 @@
-
/*
- oql.c -
+ oql.c - Object Query Language.
+
+ Copyright (C) 2001 Free Software Foundation
+
+ This file is part of the GNU Enterprise Application Server (GEAS)
+
+ GEAS is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2, or (at your option) any later
+ version.
- Part of GNU Enterprise Application Server (GEAS)
-
- Copyright (C) 2001 Free Software Foundation
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- $Id: oql.c,v 1.55 2001/06/02 00:24:34 ntiffin Exp $
-
+ GEAS is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GEAS; if not, write to the Free Software Foundation, Inc.,
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ $Id: oql.c,v 1.56 2001/06/05 18:50:22 baumannd Exp $
*/
+
#include <string.h>
#include <ctype.h>
@@ -31,902 +30,929 @@
#include "oql.h"
#include "geas-server.h"
-static _QueryData *create_query_data(const char *orderby);
-static _QueryCondition *create_query_condition(const char *targetclass,
- const char *field,
- const char *relation,
- const char *value);
-static void free_query_condition(_QueryCondition * condition);
+static _QueryData *create_query_data (const char *orderby);
+static _QueryCondition *create_query_condition (const char *targetclass,
+ const char *field,
+ const char *relation,
+ const char *value);
+static void free_query_condition (_QueryCondition * condition);
-int oql_sort_string_name(gpointer a, gpointer b);
+int oql_sort_string_name (gpointer a, gpointer b);
/* this was a bad idea - really not thread safe */
static char *last_oql_error = NULL;
const char *
-get_last_oql_error()
- {
- fatal_error("This function should not be called");
- return NULL;
- }
-
-static void oql_add_conditions_to_sql(_QueryData * q, DBType db, GString *
buf);
-static void oql_add_complex_conditions_to_sql(_QueryData * q, DBType db,
GString * buf);
-static void oql_add_complex_constraint_to_sql(_QueryData * q, odl_class * cl,
DBType db, oql_constraint * c,
- GString * buf);
-static GString *oql_make_select(_QueryData * q, DBType db);
-static GString *oql_make_delete(_QueryData * q, DBType db);
-static GString *oql_make_write(_QueryData * q, DBType db);
-
-static char *oql_quote_value(const char *value, DBType db);
+get_last_oql_error ()
+{
+ fatal_error ("This function should not be called");
+ return NULL;
+}
-/* main translate-to-sql function */
+static void oql_add_conditions_to_sql (_QueryData * q, DBType db,
+ GString * buf);
+static void oql_add_complex_conditions_to_sql (_QueryData * q, DBType db,
+ GString * buf);
+static void oql_add_complex_constraint_to_sql (_QueryData * q, odl_class * cl,
+ DBType db, oql_constraint * c,
+ GString * buf);
+static GString *oql_make_select (_QueryData * q, DBType db);
+static GString *oql_make_delete (_QueryData * q, DBType db);
+static GString *oql_make_write (_QueryData * q, DBType db);
+
+static char *oql_quote_value (const char *value, DBType db);
+
+/* ------------------------------------------------------------------------- *\
+ * Generate SQL query form OQL query.
+\* ------------------------------------------------------------------------- */
const char *
-oql_query_as_sql(_QueryData * q, DBType database)
- {
- char *retval;
- char *type = NULL, *dbtype = NULL;
- GString *buf = NULL;
-
- // trace_functioncall();
-
- switch (q->type)
- {
- case OQL_SELECT:
+oql_query_as_sql (_QueryData * q, DBType database)
+{
+ char *retval;
+ char *type = NULL, *dbtype = NULL;
+ GString *buf = NULL;
+
+ switch (q->type)
+ {
+ case OQL_SELECT:
type = "SELECT";
break;
- case OQL_WRITE:
+ case OQL_WRITE:
type = "WRITE";
break;
- case OQL_DELETE:
+ case OQL_DELETE:
type = "DELETE";
break;
- default:
+ default:
type = "<unknown>";
break;
- }
- switch (database)
- {
- case OQL_DBTYPE_MYSQL:
+ }
+ switch (database)
+ {
+ case OQL_DBTYPE_MYSQL:
dbtype = "MySQL";
break;
- case OQL_DBTYPE_POSTGRESQL:
+ case OQL_DBTYPE_POSTGRESQL:
dbtype = "PostgreSQL";
break;
- default:
+ default:
dbtype = "<unknown>";
- }
+ }
- if (q->sql)
- {
+ if (q->sql)
+ {
return (q->sql);
- }
+ }
- switch (q->type)
- {
- case OQL_SELECT:
- buf = oql_make_select(q, database);
- break;
- case OQL_DELETE:
- buf = oql_make_delete(q, database);
- break;
- case OQL_WRITE:
- buf = oql_make_write(q, database);
- break;
- }
- if (buf)
- {
+ switch (q->type)
+ {
+ case OQL_SELECT:
+ buf = oql_make_select (q, database);
+ break;
+ case OQL_DELETE:
+ buf = oql_make_delete (q, database);
+ break;
+ case OQL_WRITE:
+ buf = oql_make_write (q, database);
+ break;
+ }
+ if (buf)
+ {
if (database == OQL_DBTYPE_CACHEONLY)
- {
- retval = buf->str;
- buf->str = NULL;
- g_string_free(buf, TRUE);
- }
+ {
+ retval = buf->str;
+ buf->str = NULL;
+ g_string_free (buf, TRUE);
+ }
else
- {
- q->sql = buf->str;
- retval = q->sql;
- buf->str = NULL;
- g_string_free(buf, TRUE);
- }
- }
-
- if (!retval)
- {
- fatal_error("error : no SQL was generated\n"
- "(serious error somewhere in the OQL module - hi, jamest, is
this more helpful :)\n");
- }
- return (retval);
- }
+ {
+ q->sql = buf->str;
+ retval = q->sql;
+ buf->str = NULL;
+ g_string_free (buf, TRUE);
+ }
+ }
+ if (!retval)
+ {
+ fatal_error ("error : no SQL was generated\n"
+ "(serious error somewhere in the OQL module - hi, jamest,
is this more helpful :)\n");
+ }
+ return (retval);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Add conditions to the SQL query.
+\* ------------------------------------------------------------------------- */
static void
-oql_add_conditions_to_sql(_QueryData * q, DBType db, GString * buf)
- {
- GList *l = NULL;
- gboolean need_and = FALSE;
- char *quoted = NULL;
- char *temp;
-
- // trace_functioncall();
- g_string_append(buf, " WHERE ");
-
- /* link classes together by objectid field */
- if (g_list_length(q->classes) > 1)
- {
+oql_add_conditions_to_sql (_QueryData * q, DBType db, GString * buf)
+{
+ GList *l = NULL;
+ gboolean need_and = FALSE;
+ char *quoted = NULL;
+ char *temp;
+
+ g_string_append (buf, " WHERE ");
+
+ /* link classes together by objectid field */
+ if (g_list_length (q->classes) > 1)
+ {
l = q->classes->next;
- g_string_append(buf, "(");
+ g_string_append (buf, "(");
while (l)
- {
- quoted = oql_quote_column(q->classes->data, "objectid", db);
- g_string_append(buf, quoted);
- g_free(quoted);
-
- g_string_append(buf, "=");
-
- quoted = oql_quote_column(l->data, "objectid", db);
- g_string_append(buf, quoted);
- g_free(quoted);
-
- if (l->next)
- g_string_append(buf, " AND ");
-
- l = g_list_next(l);
- }
- g_string_append(buf, ")");
+ {
+ quoted = oql_quote_column (q->classes->data, "objectid", db);
+ g_string_append (buf, quoted);
+ g_free (quoted);
+
+ g_string_append (buf, "=");
+
+ quoted = oql_quote_column (l->data, "objectid", db);
+ g_string_append (buf, quoted);
+ g_free (quoted);
+
+ if (l->next)
+ g_string_append (buf, " AND ");
+
+ l = g_list_next (l);
+ }
+ g_string_append (buf, ")");
need_and = TRUE;
- }
+ }
- if (q->conditions)
- {
+ if (q->conditions)
+ {
if (need_and)
- g_string_append(buf, " AND ");
+ g_string_append (buf, " AND ");
need_and = TRUE;
l = q->conditions;
while (l)
- {
- _QueryCondition *c = l->data;
+ {
+ _QueryCondition *c = l->data;
- g_string_append(buf, "(");
+ g_string_append (buf, "(");
- switch (db)
+ switch (db)
{
- case OQL_DBTYPE_MYSQL:
- if (!c->casesensitive)
- g_string_append(buf, "upper(");
- break;
- case OQL_DBTYPE_POSTGRESQL:
- if (!c->casesensitive)
- g_string_append(buf, "upper(rtrim(");
- break;
- default:
+ case OQL_DBTYPE_MYSQL:
+ if (!c->casesensitive)
+ g_string_append (buf, "upper(");
+ break;
+ case OQL_DBTYPE_POSTGRESQL:
+ if (!c->casesensitive)
+ g_string_append (buf, "upper(rtrim(");
+ break;
+ default:
}
- quoted = oql_quote_column(c->targetclass, c->field, db);
- g_string_append(buf, quoted);
- g_free(quoted);
- switch (db)
+ quoted = oql_quote_column (c->targetclass, c->field, db);
+ g_string_append (buf, quoted);
+ g_free (quoted);
+ switch (db)
{
- case OQL_DBTYPE_MYSQL:
- if (!c->casesensitive)
- g_string_append(buf, ")");
- break;
- case OQL_DBTYPE_POSTGRESQL:
- if (!c->casesensitive)
- g_string_append(buf, ",' '))");
- break;
- default:
+ case OQL_DBTYPE_MYSQL:
+ if (!c->casesensitive)
+ g_string_append (buf, ")");
+ break;
+ case OQL_DBTYPE_POSTGRESQL:
+ if (!c->casesensitive)
+ g_string_append (buf, ",' '))");
+ break;
+ default:
}
- switch (c->test)
+ switch (c->test)
{
- case q_hackish:
- g_string_append(buf, c->relation);
- quoted = oql_quote_value(c->value, db);
- break;
- case q_equals:
- g_string_append(buf, "=");
- quoted = oql_quote_value(c->value, db);
- break;
- case q_lessthan:
- g_string_append(buf, "<");
- quoted = oql_quote_value(c->value, db);
- break;
- case q_greaterthan:
- g_string_append(buf, ">");
- quoted = oql_quote_value(c->value, db);
- break;
- case q_contains:
- g_string_append(buf, " LIKE ");
- temp = g_strdup_printf("%%%s%%", c->value);
- quoted = oql_quote_value(temp, db);
- g_free(temp);
- break;
- case q_startswith:
- g_string_append(buf, " LIKE ");
- temp = g_strdup_printf("%s%%", c->value);
- quoted = oql_quote_value(temp, db);
- g_free(temp);
- break;
- case q_endswith:
- g_string_append(buf, " LIKE ");
- temp = g_strdup_printf("%s%%", c->value);
- quoted = oql_quote_value(temp, db);
- g_free(temp);
- break;
- case q_notequals:
- /* TODO */
- break;
- case q_notlessthan:
- /* TODO */
- break;
- case q_notgreaterthan:
- /* TODO */
- break;
- case q_notcontains:
- /* TODO */
- break;
- case q_notstartswith:
- /* TODO */
- break;
- case q_notendswith:
- /* TODO */
- break;
+ case q_hackish:
+ g_string_append (buf, c->relation);
+ quoted = oql_quote_value (c->value, db);
+ break;
+ case q_equals:
+ g_string_append (buf, "=");
+ quoted = oql_quote_value (c->value, db);
+ break;
+ case q_lessthan:
+ g_string_append (buf, "<");
+ quoted = oql_quote_value (c->value, db);
+ break;
+ case q_greaterthan:
+ g_string_append (buf, ">");
+ quoted = oql_quote_value (c->value, db);
+ break;
+ case q_contains:
+ g_string_append (buf, " LIKE ");
+ temp = g_strdup_printf ("%%%s%%", c->value);
+ quoted = oql_quote_value (temp, db);
+ g_free (temp);
+ break;
+ case q_startswith:
+ g_string_append (buf, " LIKE ");
+ temp = g_strdup_printf ("%s%%", c->value);
+ quoted = oql_quote_value (temp, db);
+ g_free (temp);
+ break;
+ case q_endswith:
+ g_string_append (buf, " LIKE ");
+ temp = g_strdup_printf ("%s%%", c->value);
+ quoted = oql_quote_value (temp, db);
+ g_free (temp);
+ break;
+ case q_notequals:
+ /* TODO */
+ break;
+ case q_notlessthan:
+ /* TODO */
+ break;
+ case q_notgreaterthan:
+ /* TODO */
+ break;
+ case q_notcontains:
+ /* TODO */
+ break;
+ case q_notstartswith:
+ /* TODO */
+ break;
+ case q_notendswith:
+ /* TODO */
+ break;
}
- switch (db)
+ switch (db)
{
- case OQL_DBTYPE_MYSQL:
- if (!c->casesensitive)
- g_string_append(buf, "upper(");
- break;
- case OQL_DBTYPE_POSTGRESQL:
- if (!c->casesensitive)
- g_string_append(buf, "upper(");
- break;
- default:
+ case OQL_DBTYPE_MYSQL:
+ if (!c->casesensitive)
+ g_string_append (buf, "upper(");
+ break;
+ case OQL_DBTYPE_POSTGRESQL:
+ if (!c->casesensitive)
+ g_string_append (buf, "upper(");
+ break;
+ default:
}
- g_string_append(buf, quoted);
- g_free(quoted);
+ g_string_append (buf, quoted);
+ g_free (quoted);
- switch (db)
+ switch (db)
{
- case OQL_DBTYPE_MYSQL:
- if (!c->casesensitive)
- g_string_append(buf, ")");
- break;
- case OQL_DBTYPE_POSTGRESQL:
- if (!c->casesensitive)
- g_string_append(buf, ")");
- break;
- default:
+ case OQL_DBTYPE_MYSQL:
+ if (!c->casesensitive)
+ g_string_append (buf, ")");
+ break;
+ case OQL_DBTYPE_POSTGRESQL:
+ if (!c->casesensitive)
+ g_string_append (buf, ")");
+ break;
+ default:
}
- g_string_append(buf, ")");
+ g_string_append (buf, ")");
- if (l->next)
- g_string_append(buf, " AND ");
- l = g_list_next(l);
- }
- }
- if (q->complex)
- {
+ if (l->next)
+ g_string_append (buf, " AND ");
+ l = g_list_next (l);
+ }
+ }
+ if (q->complex)
+ {
if (need_and)
- g_string_append(buf, " AND ");
- oql_add_complex_conditions_to_sql(q, db, buf);
- }
- }
+ g_string_append (buf, " AND ");
+ oql_add_complex_conditions_to_sql (q, db, buf);
+ }
+}
+/* ------------------------------------------------------------------------- *\
+ * Transform any illegal column names ("table.column") to a legal form.
+\* ------------------------------------------------------------------------- */
char *
-oql_quote_column(const char *table, const char *column, DBType db)
- {
- /* transform any illegal column names ("table.column") to a legal form */
- char *mangled = NULL;
- char *retval = NULL;
- char *quotedttable = NULL;
- char *quotedcolumn = NULL;
- char *p;
- int dotcount = 0;
-
- p = (char *)column;
- while (p && *p != '\0')
- {
+oql_quote_column (const char *table, const char *column, DBType db)
+{
+ char *mangled = NULL;
+ char *retval = NULL;
+ char *quotedttable = NULL;
+ char *quotedcolumn = NULL;
+ char *p;
+ int dotcount = 0;
+
+ p = (char *) column;
+ while (p && *p != '\0')
+ {
if (*p == '.')
- dotcount++;
+ dotcount++;
p++;
- }
+ }
- // trace_functioncall();
- if (table)
- {
- mangled = odl_mangle_qualified_name(table);
+ if (table)
+ {
+ mangled = odl_mangle_qualified_name (table);
switch (db)
- {
- case OQL_DBTYPE_CACHEONLY:
- case OQL_DBTYPE_MYSQL:
- if (is_word_reserved(mangled, db))
- quotedttable = g_strdup_printf("__%s", mangled, db);
- else
- quotedttable = g_strdup(mangled);
- break;
-
- case OQL_DBTYPE_POSTGRESQL:
- quotedttable = g_strdup(mangled);
- if (is_word_reserved(mangled, db))
- quotedttable = g_strdup_printf("\"%s\"", mangled, db);
- else
- quotedttable = g_strdup(mangled);
- break;
- }
- }
+ {
+ case OQL_DBTYPE_CACHEONLY:
+ case OQL_DBTYPE_MYSQL:
+ if (is_word_reserved (mangled, db))
+ quotedttable = g_strdup_printf ("__%s", mangled, db);
+ else
+ quotedttable = g_strdup (mangled);
+ break;
+
+ case OQL_DBTYPE_POSTGRESQL:
+ quotedttable = g_strdup (mangled);
+ if (is_word_reserved (mangled, db))
+ quotedttable = g_strdup_printf ("\"%s\"", mangled, db);
+ else
+ quotedttable = g_strdup (mangled);
+ break;
+ }
+ }
- if (column)
- {
+ if (column)
+ {
switch (db)
- {
- case OQL_DBTYPE_CACHEONLY:
- case OQL_DBTYPE_MYSQL:
- /* TODO: if column == illegal column name, change it */
- if (is_word_reserved(column, db))
- quotedcolumn = g_strdup_printf("__%s", column, db);
- else
- quotedcolumn = g_strdup(column);
- break;
- case OQL_DBTYPE_POSTGRESQL:
- /* TODO: if column == illegal column name, change it */
- if (is_word_reserved(column, db))
- quotedcolumn = g_strdup_printf("\"%s\"", column, db);
- else
- quotedcolumn = g_strdup(column);
- break;
- }
- }
-
- /* replace a dot in a column name with an underscore */
- /* cost.amount -> cost_amount */
- if (dotcount > 0)
- {
- char *newf = g_malloc(strlen(quotedcolumn) + 1 + dotcount);
+ {
+ case OQL_DBTYPE_CACHEONLY:
+ case OQL_DBTYPE_MYSQL:
+ /* TODO: if column == illegal column name, change it */
+ if (is_word_reserved (column, db))
+ quotedcolumn = g_strdup_printf ("__%s", column, db);
+ else
+ quotedcolumn = g_strdup (column);
+ break;
+ case OQL_DBTYPE_POSTGRESQL:
+ /* TODO: if column == illegal column name, change it */
+ if (is_word_reserved (column, db))
+ quotedcolumn = g_strdup_printf ("\"%s\"", column, db);
+ else
+ quotedcolumn = g_strdup (column);
+ break;
+ }
+ }
+
+ /* replace a dot in a column name with an underscore */
+ /* cost.amount -> cost_amount */
+ if (dotcount > 0)
+ {
+ char *newf = g_malloc (strlen (quotedcolumn) + 1 + dotcount);
- memcpy(newf, quotedcolumn, strlen(quotedcolumn) + 1);
- g_free(quotedcolumn);
+ memcpy (newf, quotedcolumn, strlen (quotedcolumn) + 1);
+ g_free (quotedcolumn);
quotedcolumn = newf;
+
+ for (p = strchr (quotedcolumn, '.'); p != NULL;
+ p = strchr (quotedcolumn, '.'))
+ {
+ /* make space for __ */
+ memmove ((void *) (p + 2), (const void *) (p + 1), strlen (p));
+
+ /* replace . with __ */
+ *p = '_';
+ p++;
+ *p = '_';
+ }
+ }
- for (p = strchr(quotedcolumn, '.'); p != NULL; p = strchr(quotedcolumn,
'.'))
- {
- /* make space for __ */
- memmove((void *)(p + 2), (const void *)(p + 1), strlen(p));
-
- /* replace . with __ */
- *p = '_';
- p++;
- *p = '_';
- }
- }
-
- if (table && column)
- retval = g_strdup_printf("%s.%s", quotedttable, quotedcolumn);
- else if (table)
- retval = g_strdup(quotedttable);
- else
- retval = g_strdup(quotedcolumn);
-
- /* convert entire string to lower case */
- p = retval;
- while (*p != '\0')
- {
- *p = tolower(*p);
+ if (table && column)
+ retval = g_strdup_printf ("%s.%s", quotedttable, quotedcolumn);
+ else if (table)
+ retval = g_strdup (quotedttable);
+ else
+ retval = g_strdup (quotedcolumn);
+
+ /* convert entire string to lower case */
+ p = retval;
+ while (*p != '\0')
+ {
+ *p = tolower (*p);
p++;
- }
+ }
- if (mangled)
- g_free(mangled);
- if (quotedttable)
- g_free(quotedttable);
- if (quotedcolumn)
- g_free(quotedcolumn);
+ if (mangled)
+ g_free (mangled);
+ if (quotedttable)
+ g_free (quotedttable);
+ if (quotedcolumn)
+ g_free (quotedcolumn);
- return (retval);
- }
+ return (retval);
+}
+/* ------------------------------------------------------------------------- *\
+ * Quote a value in an SQL statement.
+\* ------------------------------------------------------------------------- */
static char *
-oql_quote_value(const char *value, DBType db)
- {
- int count, i;
- int len;
- char *str, *ptr, *out;
-
- // trace_functioncall();
- len = strlen(value);
- switch (db)
- {
- case OQL_DBTYPE_CACHEONLY:
- case OQL_DBTYPE_MYSQL:
+oql_quote_value (const char *value, DBType db)
+{
+ int count, i;
+ int len;
+ char *str, *ptr, *out;
+
+ len = strlen (value);
+ switch (db)
+ {
+ case OQL_DBTYPE_CACHEONLY:
+ case OQL_DBTYPE_MYSQL:
/* count characters to quote */
count = 0;
for (i = 0; i < len; i++)
- if (value[i] == '\'' || value[i] == '\\')
- count++;
+ if (value[i] == '\'' || value[i] == '\\')
+ count++;
if (count == 0)
- return (g_strdup_printf("'%s'", value));
+ return (g_strdup_printf ("'%s'", value));
/* count: extra characters len: original chars 1: space for \0 2: space
for quotes (') */
- out = (char *)g_malloc(sizeof(char) * (count + len + 1 + 2));
+ out = (char *) g_malloc (sizeof (char) * (count + len + 1 + 2));
ptr = out;
- str = (char *)value;
+ str = (char *) value;
*ptr = '\'';
while (*str != '\0')
- {
- if (*str == '\'')
+ {
+ if (*str == '\'')
{
- *ptr = '\\';
- ptr++;
+ *ptr = '\\';
+ ptr++;
}
- if (*str == '\\')
+ if (*str == '\\')
{
- *ptr = '\\';
- ptr++;
+ *ptr = '\\';
+ ptr++;
}
- *ptr = *str;
- ptr++;
- str++;
- }
+ *ptr = *str;
+ ptr++;
+ str++;
+ }
*ptr++ = '\'';
*ptr = '\0';
return (out);
break;
- case OQL_DBTYPE_POSTGRESQL:
+ case OQL_DBTYPE_POSTGRESQL:
/* really a TODO */
count = 0;
for (i = 0; i < len; i++)
- if (value[i] == '\'' || value[i] == '\\')
- count++;
+ if (value[i] == '\'' || value[i] == '\\')
+ count++;
if (count == 0)
- return (g_strdup_printf("'%s'", value));
+ return (g_strdup_printf ("'%s'", value));
/* count: extra characters len: original chars 1: space for \0 2: space
for quotes (') */
- out = (char *)g_malloc(sizeof(char) * (count + len + 1 + 2));
+ out = (char *) g_malloc (sizeof (char) * (count + len + 1 + 2));
ptr = out;
- str = (char *)value;
+ str = (char *) value;
*ptr = '\'';
while (*str != '\0')
- {
- if (*str == '\'')
+ {
+ if (*str == '\'')
{
- *ptr = '\\';
- ptr++;
+ *ptr = '\\';
+ ptr++;
}
- if (*str == '\\')
+ if (*str == '\\')
{
- *ptr = '\\';
- ptr++;
+ *ptr = '\\';
+ ptr++;
}
- *ptr = *str;
- ptr++;
- str++;
- }
+ *ptr = *str;
+ ptr++;
+ str++;
+ }
*ptr++ = '\'';
*ptr = '\0';
return (out);
break;
- default:
- fatal_error("Unsupported databsae type : %d", db);
- }
- return (NULL);
- }
+ default:
+ fatal_error ("Unsupported databsae type : %d", db);
+ }
+ return (NULL);
+}
+/* ------------------------------------------------------------------------- *\
+ * Build a "SELECT" SQL statement.
+\* ------------------------------------------------------------------------- */
static GString *
-oql_make_select(_QueryData * q, DBType db)
- {
- GString *buf;
- GList *tmp;
- char *loadclass = NULL;
- char *quoted;
-
- // trace_functioncall();
- if (q->classes)
- loadclass = q->classes->data;
- else
- return (NULL);
-
- buf = g_string_new("SELECT ");
- if (!buf)
- return (NULL);
-
- /* add fields to read */
- tmp = q->fields;
- while (tmp)
- {
- quoted = oql_quote_column(loadclass, tmp->data, db);
- g_string_append(buf, quoted);
- g_free(quoted);
+oql_make_select (_QueryData * q, DBType db)
+{
+ GString *buf;
+ GList *tmp;
+ char *loadclass = NULL;
+ char *quoted;
+
+ if (q->classes)
+ loadclass = q->classes->data;
+ else
+ return (NULL);
+
+ buf = g_string_new ("SELECT ");
+ if (!buf)
+ return (NULL);
+
+ /* add fields to read */
+ tmp = q->fields;
+ while (tmp)
+ {
+ quoted = oql_quote_column (loadclass, tmp->data, db);
+ g_string_append (buf, quoted);
+ g_free (quoted);
if (tmp->next)
- g_string_append(buf, ",");
+ g_string_append (buf, ",");
- tmp = g_list_next(tmp);
- }
+ tmp = g_list_next (tmp);
+ }
- g_string_append(buf, " FROM ");
+ g_string_append (buf, " FROM ");
- /* add table names */
- tmp = q->classes;
- while (tmp)
- {
- quoted = oql_quote_column(tmp->data, NULL, db);
- g_string_append(buf, quoted);
- g_free(quoted);
+ /* add table names */
+ tmp = q->classes;
+ while (tmp)
+ {
+ quoted = oql_quote_column (tmp->data, NULL, db);
+ g_string_append (buf, quoted);
+ g_free (quoted);
if (tmp->next)
- g_string_append(buf, ",");
+ g_string_append (buf, ",");
+
+ tmp = g_list_next (tmp);
+ }
- tmp = g_list_next(tmp);
- }
+ /* add restrictions to the query */
+ if (g_list_length (q->classes) > 1 || q->conditions || q->complex)
+ oql_add_conditions_to_sql (q, db, buf);
- /* add restrictions to the query */
- if (g_list_length(q->classes) > 1 || q->conditions || q->complex)
- oql_add_conditions_to_sql(q, db, buf);
-
- /* add order by clause */
- if (q->orderby)
- {
+ /* add order by clause */
+ if (q->orderby)
+ {
char *quoted;
- g_string_append(buf, " ORDER BY ");
- quoted = oql_quote_column(loadclass, q->orderby, db);
- g_string_append(buf, quoted);
- g_free(quoted);
+ g_string_append (buf, " ORDER BY ");
+ quoted = oql_quote_column (loadclass, q->orderby, db);
+ g_string_append (buf, quoted);
+ g_free (quoted);
if (q->reversesearch)
- g_string_append(buf, " DESC");
- }
-
- if( q->uselimit )
- {
- quoted = g_strdup_printf( " LIMIT %lu" , q->maxresults );
- g_string_append(buf, quoted);
- g_free( quoted );
- }
-
- /* done */
- return (buf);
- }
+ g_string_append (buf, " DESC");
+ }
-static GString *
-oql_make_delete(_QueryData * q, DBType db)
- {
- GString *buf;
- /* GList *tmp; */
- char *loadclass = NULL;
- char *quoted, *classname, *key;
-
- // trace_functioncall();
- if (q->classes)
- loadclass = q->classes->data;
- else
- return (NULL);
+ if (q->uselimit)
+ {
+ quoted = g_strdup_printf (" LIMIT %lu", q->maxresults);
+ g_string_append (buf, quoted);
+ g_free (quoted);
+ }
- buf = g_string_new("DELETE FROM ");
- if (!buf)
- return (NULL);
+ /* done */
+ return (buf);
+}
- classname = (char *)g_list_nth_data(q->classes, 0);
- key = (char *)g_list_nth_data(q->values, 0);
+/* ------------------------------------------------------------------------- *\
+ * Build a "DELETE" SQL statement.
+\* ------------------------------------------------------------------------- */
+static GString *
+oql_make_delete (_QueryData * q, DBType db)
+{
+ GString *buf;
+ /* GList *tmp; */
+ char *loadclass = NULL;
+ char *quoted, *classname, *key;
+
+ if (q->classes)
+ loadclass = q->classes->data;
+ else
+ return (NULL);
+
+ buf = g_string_new ("DELETE FROM ");
+ if (!buf)
+ return (NULL);
+
+ classname = (char *) g_list_nth_data (q->classes, 0);
+ key = (char *) g_list_nth_data (q->values, 0);
+
+ /* class to delete */
+ quoted = oql_quote_column (classname, NULL, db);
+ g_string_append (buf, quoted);
+ g_free (quoted);
+
+ /* add restrictions to the query */
+ if (g_list_length (q->classes) > 1 || q->conditions)
+ oql_add_conditions_to_sql (q, db, buf);
- /* class to delete */
- quoted = oql_quote_column(classname, NULL, db);
- g_string_append(buf, quoted);
- g_free(quoted);
-
- /* add restrictions to the query */
- if (g_list_length(q->classes) > 1 || q->conditions)
- oql_add_conditions_to_sql(q, db, buf);
-
- /* done */
- return (buf);
- }
+ /* done */
+ return (buf);
+}
+/* ------------------------------------------------------------------------- *\
+ * Build a "WRITE" SQL statement.
+\* ------------------------------------------------------------------------- */
static GString *
-oql_make_write(_QueryData * q, DBType db)
- {
- char *writeclass = NULL, *quoted = NULL;
- GList *tmp = NULL, *tmp2 = NULL;
- GString *buf = NULL;
- odl_class *c;
- char *translated = NULL;
-
- /* trace_functioncall(); */
- if (q->classes)
- writeclass = q->classes->data;
- else
- return (NULL);
+oql_make_write (_QueryData * q, DBType db)
+{
+ char *writeclass = NULL, *quoted = NULL;
+ GList *tmp = NULL, *tmp2 = NULL;
+ GString *buf = NULL;
+ odl_class *c;
+ char *translated = NULL;
+
+ if (q->classes)
+ writeclass = q->classes->data;
+ else
+ return (NULL);
- /* get class definition */
- c = odl_find_class(all_classes, writeclass, NULL);
+ /* get class definition */
+ c = odl_find_class (all_classes, writeclass, NULL);
- if (db == OQL_DBTYPE_MYSQL)
- {
+ if (db == OQL_DBTYPE_MYSQL)
+ {
/* make REPLACE query for MySQL - inserts new data or changes old data */
- buf = g_string_new("REPLACE INTO ");
+ buf = g_string_new ("REPLACE INTO ");
if (!buf)
- return (NULL);
+ return (NULL);
/* class to write to */
- quoted = oql_quote_column(writeclass, NULL, db);
- g_string_append(buf, quoted);
- g_free(quoted);
+ quoted = oql_quote_column (writeclass, NULL, db);
+ g_string_append (buf, quoted);
+ g_free (quoted);
/* fields */
- g_string_append(buf, "(");
+ g_string_append (buf, "(");
tmp = q->fields;
while (tmp)
- {
- quoted = oql_quote_column(NULL, tmp->data, db);
- g_string_append(buf, quoted);
- g_free(quoted);
-
- if (tmp->next)
- g_string_append(buf, ",");
-
- tmp = g_list_next(tmp);
- }
- g_string_append(buf, ")");
+ {
+ quoted = oql_quote_column (NULL, tmp->data, db);
+ g_string_append (buf, quoted);
+ g_free (quoted);
+ if (tmp->next)
+ g_string_append (buf, ",");
+
+ tmp = g_list_next (tmp);
+ }
+ g_string_append (buf, ")");
+
/* values */
- g_string_append(buf, "VALUES (");
+ g_string_append (buf, "VALUES (");
tmp = q->values;
tmp2 = q->fields;
while (tmp)
- {
- translated = oql_translate_for_write(tmp->data, c, tmp2->data, db);
- if (translated)
+ {
+ translated = oql_translate_for_write (tmp->data, c, tmp2->data, db);
+ if (translated)
{
- quoted = oql_quote_value(translated, db);
- g_free(translated);
+ quoted = oql_quote_value (translated, db);
+ g_free (translated);
}
- else
- quoted = g_strdup("");
- g_string_append(buf, quoted);
- g_free(quoted);
-
- if (tmp->next)
- g_string_append(buf, ",");
-
- tmp = g_list_next(tmp);
- tmp2 = g_list_next(tmp2);
- }
- g_string_append(buf, ")");
- }
- else if (db == OQL_DBTYPE_POSTGRESQL && !q->indatabase)
- {
+ else
+ quoted = g_strdup ("");
+ g_string_append (buf, quoted);
+ g_free (quoted);
+
+ if (tmp->next)
+ g_string_append (buf, ",");
+
+ tmp = g_list_next (tmp);
+ tmp2 = g_list_next (tmp2);
+ }
+ g_string_append (buf, ")");
+ }
+ else if (db == OQL_DBTYPE_POSTGRESQL && !q->indatabase)
+ {
/* make an INSERT query for PostgreSQL - inserts new data */
- buf = g_string_new("INSERT INTO ");
+ buf = g_string_new ("INSERT INTO ");
if (!buf)
- return (NULL);
+ return (NULL);
/* class to write to */
- quoted = oql_quote_column(writeclass, NULL, db);
- g_string_append(buf, quoted);
- g_free(quoted);
+ quoted = oql_quote_column (writeclass, NULL, db);
+ g_string_append (buf, quoted);
+ g_free (quoted);
/* fields */
- g_string_append(buf, "(");
+ g_string_append (buf, "(");
tmp = q->fields;
while (tmp)
- {
- quoted = oql_quote_column(NULL, tmp->data, db);
- g_string_append(buf, quoted);
- g_free(quoted);
-
- if (tmp->next)
- g_string_append(buf, ",");
-
- tmp = g_list_next(tmp);
- }
- g_string_append(buf, ")");
+ {
+ quoted = oql_quote_column (NULL, tmp->data, db);
+ g_string_append (buf, quoted);
+ g_free (quoted);
+
+ if (tmp->next)
+ g_string_append (buf, ",");
+
+ tmp = g_list_next (tmp);
+ }
+ g_string_append (buf, ")");
/* values */
- g_string_append(buf, "VALUES (");
+ g_string_append (buf, "VALUES (");
tmp = q->values;
tmp2 = q->fields;
while (tmp)
- {
- translated = oql_translate_for_write(tmp->data, c, tmp2->data, db);
- if (translated)
+ {
+ translated = oql_translate_for_write (tmp->data, c, tmp2->data, db);
+ if (translated)
{
- quoted = oql_quote_value(translated, db);
- g_free(translated);
+ quoted = oql_quote_value (translated, db);
+ g_free (translated);
}
- else
- quoted = g_strdup("");
- g_string_append(buf, quoted);
- g_free(quoted);
-
- if (tmp->next)
- g_string_append(buf, ",");
-
- tmp = g_list_next(tmp);
- tmp2 = g_list_next(tmp2);
- }
- g_string_append(buf, ")");
- }
- else if (db == OQL_DBTYPE_POSTGRESQL && q->indatabase)
- {
+ else
+ quoted = g_strdup ("");
+ g_string_append (buf, quoted);
+ g_free (quoted);
+
+ if (tmp->next)
+ g_string_append (buf, ",");
+
+ tmp = g_list_next (tmp);
+ tmp2 = g_list_next (tmp2);
+ }
+ g_string_append (buf, ")");
+ }
+ else if (db == OQL_DBTYPE_POSTGRESQL && q->indatabase)
+ {
GList *f, *v;
/* make an UPDATE query for PostgreSQL - changes old data */
- buf = g_string_new("UPDATE ");
+ buf = g_string_new ("UPDATE ");
if (!buf)
- return (NULL);
+ return (NULL);
- quoted = oql_quote_column(writeclass, NULL, db);
- g_string_append(buf, quoted);
- g_free(quoted);
+ quoted = oql_quote_column (writeclass, NULL, db);
+ g_string_append (buf, quoted);
+ g_free (quoted);
f = q->fields;
v = q->values;
- g_string_append(buf, " SET ");
+ g_string_append (buf, " SET ");
while (f && v)
- {
- quoted = oql_quote_column(NULL, f->data, db);
- g_string_append(buf, quoted);
- g_free(quoted);
-
- g_string_append(buf, "=");
-
- /* translate from GEAS format to database format, as appropriate */
- translated = oql_translate_for_write(v->data, c, f->data, db);
- if (translated)
+ {
+ quoted = oql_quote_column (NULL, f->data, db);
+ g_string_append (buf, quoted);
+ g_free (quoted);
+
+ g_string_append (buf, "=");
+
+ /* translate from GEAS format to database format, as appropriate */
+ translated = oql_translate_for_write (v->data, c, f->data, db);
+ if (translated)
{
- quoted = oql_quote_value(translated, db);
- g_free(translated);
+ quoted = oql_quote_value (translated, db);
+ g_free (translated);
}
- else
- quoted = g_strdup("");
+ else
+ quoted = g_strdup ("");
- g_string_append(buf, quoted);
- g_free(quoted);
+ g_string_append (buf, quoted);
+ g_free (quoted);
- if (f->next)
- g_string_append(buf, ",");
+ if (f->next)
+ g_string_append (buf, ",");
- f = g_list_next(f);
- v = g_list_next(v);
- }
+ f = g_list_next (f);
+ v = g_list_next (v);
+ }
/* add restrictions to the query */
- if (g_list_length(q->classes) > 1 || q->conditions)
- oql_add_conditions_to_sql(q, db, buf);
- }
-
- /* done */
- return (buf);
- }
+ if (g_list_length (q->classes) > 1 || q->conditions)
+ oql_add_conditions_to_sql (q, db, buf);
+ }
+ /* done */
+ return (buf);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Get the classname in the OQL query.
+\* ------------------------------------------------------------------------- */
const char *
-oql_query_get_classname(_QueryData * query)
- {
- /* trace_functioncall(); */
- return (char *)g_list_nth_data(((_QueryData *) query)->classes, 0);
- }
+oql_query_get_classname (_QueryData * query)
+{
+ return (char *) g_list_nth_data (((_QueryData *) query)->classes, 0);
+}
+/* ------------------------------------------------------------------------- *\
+ * Free the OQL query.
+\* ------------------------------------------------------------------------- */
void
-oql_free_query(_QueryData * q)
- {
- /* trace_functioncall(); */
- if (q)
- {
+oql_free_query (_QueryData * q)
+{
+ if (q)
+ {
if (q->sql)
- {
- g_free(q->sql);
- }
+ {
+ g_free (q->sql);
+ }
if (q->fields)
- {
- GList *f = q->fields;
+ {
+ GList *f = q->fields;
- while (f)
+ while (f)
{
- if (f->data)
- {
- g_free(f->data);
- }
- f = g_list_next(f);
+ if (f->data)
+ {
+ g_free (f->data);
+ }
+ f = g_list_next (f);
}
- g_list_free(q->fields);
- }
+ g_list_free (q->fields);
+ }
if (q->values)
- {
- GList *f = q->values;
+ {
+ GList *f = q->values;
- while (f)
+ while (f)
{
- if (f->data)
- {
- g_free(f->data);
- }
- f = g_list_next(f);
+ if (f->data)
+ {
+ g_free (f->data);
+ }
+ f = g_list_next (f);
}
- g_list_free(q->values);
- }
+ g_list_free (q->values);
+ }
if (q->conditions)
- {
- GList *f = q->conditions;
+ {
+ GList *f = q->conditions;
- while (f)
+ while (f)
{
- if (f->data)
- {
- free_query_condition(f->data);
- }
- f = g_list_next(f);
+ if (f->data)
+ {
+ free_query_condition (f->data);
+ }
+ f = g_list_next (f);
}
- g_list_free(q->conditions);
- }
+ g_list_free (q->conditions);
+ }
if (q->classes)
- {
- GList *f = q->classes;
+ {
+ GList *f = q->classes;
- while (f)
+ while (f)
{
- if (f->data)
- {
- g_free(f->data);
- }
- f = g_list_next(f);
+ if (f->data)
+ {
+ g_free (f->data);
+ }
+ f = g_list_next (f);
}
- g_list_free(q->classes);
- }
+ g_list_free (q->classes);
+ }
if (q->orderby)
- {
- g_free(q->orderby);
- }
-
- g_free(q);
- }
- }
+ {
+ g_free (q->orderby);
+ }
+ g_free (q);
+ }
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Get the "field" from the OQL query.
+\* ------------------------------------------------------------------------- */
const char *
-oql_query_get_field_name(_QueryData * query, int field)
- {
- /* trace_functioncall(); */
- return (g_list_nth_data(query->fields, field));
- }
+oql_query_get_field_name (_QueryData * query, int field)
+{
+ return (g_list_nth_data (query->fields, field));
+}
+/* ------------------------------------------------------------------------- *\
+ * Get the index for a given field in an OQL query.
+\* ------------------------------------------------------------------------- */
int
-oql_query_get_field_position(_QueryData * query, const char *fieldname)
- {
- int n = 0;
- GList *l = query->fields;
-
- /* trace_functioncall(); */
- while (l)
- {
- if (g_strcasecmp(fieldname, (char *)l->data) == 0)
- {
- return (n);
- }
- n++;
- l = g_list_next(l);
- }
- return ( -1);
- }
+oql_query_get_field_position (_QueryData * query, const char *fieldname)
+{
+ int n = 0;
+ GList *l = query->fields;
-/* create queries */
+ while (l)
+ {
+ if (g_strcasecmp (fieldname, (char *) l->data) == 0)
+ {
+ return (n);
+ }
+ n++;
+ l = g_list_next (l);
+ }
+ return (-1);
+}
-/* write data */
+/* ========================================================================= *\
+ * Create OQL queries.
+\* ========================================================================= */
+
+/* ------------------------------------------------------------------------- *\
+ * Create OQL query for writing an object.
+\* ------------------------------------------------------------------------- */
_QueryData *
-oql_write_object (const gchar *classname, const gchar *key,
- GHashTable *values, gboolean update)
+oql_write_object (const gchar * classname, const gchar * key,
+ GHashTable * values, gboolean update)
{
- _QueryData *query;
- odl_class *c;
- const gchar *fieldname;
- gchar *value;
- GList *all_fields;
- GList *field;
+ _QueryData *query;
+ odl_class *c;
+ const gchar *fieldname;
+ gchar *value;
+ GList *all_fields;
+ GList *field;
_QueryCondition *condition;
g_return_val_if_fail (classname, NULL);
@@ -955,738 +981,817 @@
query->fields = g_list_append (query->fields, g_strdup (fieldname));
query->values = g_list_append (query->values, g_strdup (value));
}
- field = g_list_next(field);
+ field = g_list_next (field);
}
- odl_fieldlist_free(all_fields);
+ odl_fieldlist_free (all_fields);
condition = create_query_condition (g_strdup (classname),
g_strdup ("objectid"),
- g_strdup ("="),
- g_strdup (key));
+ g_strdup ("="), g_strdup (key));
query->conditions = g_list_append (query->conditions, condition);
return (query);
}
_QueryData *
-oql_make_sql_query( const char *query )
+oql_make_sql_query (const char *query)
{
- _QueryData *q = create_query_data(NULL);
- if( q ) {
- q->sql = g_strdup( query );
- }
- return( q );
+ _QueryData *q = create_query_data (NULL);
+ if (q)
+ {
+ q->sql = g_strdup (query);
+ }
+ return (q);
}
-/* delete entries */
+/* ------------------------------------------------------------------------- *\
+ * Create OQL query for deleting an object.
+\* ------------------------------------------------------------------------- */
_QueryData *
-oql_delete_object(const char *classname, const char *key)
- {
- _QueryData *q = NULL;
- _QueryCondition *condition;
-
- /* trace_functioncall(); */
- q = create_query_data(NULL);
- if (!q)
- {
- errormsg("Out of memory");
+oql_delete_object (const char *classname, const char *key)
+{
+ _QueryData *q = NULL;
+ _QueryCondition *condition;
+
+ q = create_query_data (NULL);
+ if (!q)
+ {
+ errormsg ("Out of memory");
return (NULL);
- }
+ }
- q->type = OQL_DELETE;
+ q->type = OQL_DELETE;
- q->classes = g_list_append(q->classes, g_strdup(classname));
- condition = create_query_condition(g_strdup(classname),
g_strdup("objectid"), g_strdup("="), g_strdup(key));
- q->conditions = g_list_append(q->conditions, condition);
- return (q);
- }
+ q->classes = g_list_append (q->classes, g_strdup (classname));
+ condition =
+ create_query_condition (g_strdup (classname), g_strdup ("objectid"),
+ g_strdup ("="), g_strdup (key));
+ q->conditions = g_list_append (q->conditions, condition);
+ return (q);
+}
+/* ------------------------------------------------------------------------- *\
+ * Create OQL query for deleting all objects with matching classname,
+ * where the fieldname has the value of 'key'.
+\* ------------------------------------------------------------------------- */
_QueryData *
-oql_delete_all_objects(const char *classname, const char *fieldname, const
char *key)
- {
- _QueryData *q = NULL;
- _QueryCondition *condition;
-
- /* trace_functioncall(); */
- q = create_query_data(NULL);
- if (!q)
- {
- errormsg("Out of memory");
+oql_delete_all_objects (const char *classname, const char *fieldname,
+ const char *key)
+{
+ _QueryData *q = NULL;
+ _QueryCondition *condition;
+
+ q = create_query_data (NULL);
+ if (!q)
+ {
+ errormsg ("Out of memory");
return (NULL);
- }
+ }
- q->type = OQL_DELETE;
+ q->type = OQL_DELETE;
- q->classes = g_list_append(q->classes, g_strdup(classname));
- condition = create_query_condition(g_strdup(classname),
g_strdup(fieldname), g_strdup("="), g_strdup(key));
- q->conditions = g_list_append(q->conditions, condition);
- return (q);
- }
+ q->classes = g_list_append (q->classes, g_strdup (classname));
+ condition =
+ create_query_condition (g_strdup (classname), g_strdup (fieldname),
+ g_strdup ("="), g_strdup (key));
+ q->conditions = g_list_append (q->conditions, condition);
+ return (q);
+}
-/* load a single object */
+/* ------------------------------------------------------------------------- *\
+ * Create OQL query for loading a single object with objectid equal to 'key'.
+\* ------------------------------------------------------------------------- */
_QueryData *
-oql_load_object_by_key(configuration config, const char *classname, const char
*key)
- {
- GList *l;
- /* GList *tmp; */
- GList *parents;
- _QueryData *q = NULL;
- _QueryCondition *condition;
- odl_class *c;
- /* GString *buf; */
- GList *fields;
-
- /* trace_functioncall(); */
- q = create_query_data(NULL);
- if (!q)
- {
- errormsg("Out of memory");
- }
- q->type = OQL_SELECT;
-
- c = odl_find_class(all_classes, classname, NULL);
- if (!c)
- {
- errormsg("Class %s not found", classname);
- oql_free_query(q);
- abort();
+oql_load_object_by_key (configuration config, const char *classname,
+ const char *key)
+{
+ GList *l;
+ GList *parents;
+ _QueryData *q = NULL;
+ _QueryCondition *condition;
+ odl_class *c;
+ GList *fields;
+
+ q = create_query_data (NULL);
+ if (!q)
+ {
+ errormsg ("Out of memory");
+ }
+ q->type = OQL_SELECT;
+
+ c = odl_find_class (all_classes, classname, NULL);
+ if (!c)
+ {
+ errormsg ("Class %s not found", classname);
+ oql_free_query (q);
+ abort ();
return (NULL);
- }
+ }
- add_order_by(q, c->orderby, FALSE);
+ add_order_by (q, c->orderby, FALSE);
- fields = odl_class_get_fields(c, FT_basic);
- l = fields;
- while (l)
- {
+ fields = odl_class_get_fields (c, FT_basic);
+ l = fields;
+ while (l)
+ {
char *fieldname;
- fieldname = g_strdup(odl_field_get_name((odl_field *) l->data));
- q->fields = g_list_append(q->fields, fieldname);
- l = g_list_next(l);
- }
- odl_fieldlist_free(fields);
- q->fields = g_list_sort(q->fields, (GCompareFunc) oql_sort_string_name);
-
- q->classes = g_list_append(q->classes, g_strdup(classname));
- parents = odl_class_get_parentnames(c);
- if (parents)
- {
+ fieldname = g_strdup (odl_field_get_name ((odl_field *) l->data));
+ q->fields = g_list_append (q->fields, fieldname);
+ l = g_list_next (l);
+ }
+ odl_fieldlist_free (fields);
+ q->fields = g_list_sort (q->fields, (GCompareFunc) oql_sort_string_name);
+
+ q->classes = g_list_append (q->classes, g_strdup (classname));
+ parents = odl_class_get_parentnames (c);
+ if (parents)
+ {
l = parents;
while (l)
- {
- q->classes = g_list_append(q->classes, g_strdup(l->data));
- l = g_list_next(l);
- }
- odl_namelist_free(parents);
- }
- condition = create_query_condition(g_strdup(classname),
g_strdup("objectid"), g_strdup("="), g_strdup(key));
- q->conditions = g_list_append(q->conditions, condition);
- return (q);
- }
+ {
+ q->classes = g_list_append (q->classes, g_strdup (l->data));
+ l = g_list_next (l);
+ }
+ odl_namelist_free (parents);
+ }
+ condition =
+ create_query_condition (g_strdup (classname), g_strdup ("objectid"),
+ g_strdup ("="), g_strdup (key));
+ q->conditions = g_list_append (q->conditions, condition);
+ return (q);
+}
-/* load all instances of a given class */
+/* ------------------------------------------------------------------------- *\
+ * Create OQL query for loading all instances of a given class.
+\* ------------------------------------------------------------------------- */
_QueryData *
-oql_find_all_objects(configuration config, const char *classname)
- {
- _QueryData *q = NULL;
- odl_class *c;
- GList *parents, *l;
- GList *fields;
-
- /* trace_functioncall(); */
- q = create_query_data(NULL);
- if (!q)
- {
- errormsg("Out of memory");
- }
- q->type = OQL_SELECT;
-
- c = odl_find_class(all_classes, classname, NULL);
- if (!c)
- {
- errormsg("Class %s not found", classname);
- oql_free_query(q);
+oql_find_all_objects (configuration config, const char *classname)
+{
+ _QueryData *q = NULL;
+ odl_class *c;
+ GList *parents, *l;
+ GList *fields;
+
+ q = create_query_data (NULL);
+ if (!q)
+ {
+ errormsg ("Out of memory");
+ }
+ q->type = OQL_SELECT;
+
+ c = odl_find_class (all_classes, classname, NULL);
+ if (!c)
+ {
+ errormsg ("Class %s not found", classname);
+ oql_free_query (q);
return (NULL);
- }
+ }
- add_order_by(q, c->orderby, FALSE);
+ add_order_by (q, c->orderby, FALSE);
- fields = odl_class_get_fields(c, FT_basic);
- l = fields;
- while (l)
- {
+ fields = odl_class_get_fields (c, FT_basic);
+ l = fields;
+ while (l)
+ {
char *fieldname;
- fieldname = g_strdup(odl_field_get_name((odl_field *) l->data));
- q->fields = g_list_append(q->fields, fieldname);
- l = g_list_next(l);
- }
- odl_fieldlist_free(fields);
- q->fields = g_list_sort(q->fields, (GCompareFunc) oql_sort_string_name);
-
- q->classes = g_list_append(q->classes, g_strdup(classname));
- parents = odl_class_get_parentnames(c);
- if (parents)
- {
+ fieldname = g_strdup (odl_field_get_name ((odl_field *) l->data));
+ q->fields = g_list_append (q->fields, fieldname);
+ l = g_list_next (l);
+ }
+ odl_fieldlist_free (fields);
+ q->fields = g_list_sort (q->fields, (GCompareFunc) oql_sort_string_name);
+
+ q->classes = g_list_append (q->classes, g_strdup (classname));
+ parents = odl_class_get_parentnames (c);
+ if (parents)
+ {
l = parents;
while (l)
- {
- q->classes = g_list_append(q->classes, g_strdup(l->data));
- l = g_list_next(l);
- }
- odl_namelist_free(parents);
- }
- return (q);
- }
+ {
+ q->classes = g_list_append (q->classes, g_strdup (l->data));
+ l = g_list_next (l);
+ }
+ odl_namelist_free (parents);
+ }
+ return (q);
+}
-/* get a single field from an object */
+/* ------------------------------------------------------------------------- *\
+ * Create OQL query to get a single field from an object.
+\* ------------------------------------------------------------------------- */
_QueryData *
-oql_load_object_field_by_key(configuration config, const char *classname,
const char *field, const char *key)
- {
- GList *l;
- /* GList *tmp; */
- GList *parents;
- _QueryData *q = NULL;
- _QueryCondition *condition;
- odl_class *c;
- /* GString *buf; */
-
- /* trace_functioncall(); */
- q = create_query_data(NULL);
- if (!q)
- {
- errormsg("Out of memory");
- }
- q->type = OQL_SELECT;
-
- c = odl_find_class(all_classes, classname, NULL);
- if (!c)
- {
- errormsg("Class %s not found", classname);
- oql_free_query(q);
+oql_load_object_field_by_key (configuration config, const char *classname,
+ const char *field, const char *key)
+{
+ GList *l;
+ GList *parents;
+ _QueryData *q = NULL;
+ _QueryCondition *condition;
+ odl_class *c;
+
+ q = create_query_data (NULL);
+ if (!q)
+ {
+ errormsg ("Out of memory");
+ }
+ q->type = OQL_SELECT;
+
+ c = odl_find_class (all_classes, classname, NULL);
+ if (!c)
+ {
+ errormsg ("Class %s not found", classname);
+ oql_free_query (q);
return (NULL);
- }
+ }
- add_order_by(q, c->orderby, FALSE);
- q->fields = g_list_append(q->fields, g_strdup("objectid"));
- q->fields = g_list_append(q->fields, g_strdup(field));
- q->fields = g_list_sort(q->fields, (GCompareFunc) oql_sort_string_name);
- q->classes = g_list_append(q->classes, g_strdup(classname));
- parents = odl_class_get_parentnames(c);
- if (parents)
- {
+ add_order_by (q, c->orderby, FALSE);
+ q->fields = g_list_append (q->fields, g_strdup ("objectid"));
+ q->fields = g_list_append (q->fields, g_strdup (field));
+ q->fields = g_list_sort (q->fields, (GCompareFunc) oql_sort_string_name);
+ q->classes = g_list_append (q->classes, g_strdup (classname));
+ parents = odl_class_get_parentnames (c);
+ if (parents)
+ {
l = parents;
while (l)
- {
- q->classes = g_list_append(q->classes, g_strdup(l->data));
- l = g_list_next(l);
- }
- odl_namelist_free(parents);
- }
-
- condition = create_query_condition(g_strdup(classname),
g_strdup("objectid"), g_strdup("="), g_strdup(key));
- q->conditions = g_list_append(q->conditions, condition);
- return (q);
- }
+ {
+ q->classes = g_list_append (q->classes, g_strdup (l->data));
+ l = g_list_next (l);
+ }
+ odl_namelist_free (parents);
+ }
+
+ condition =
+ create_query_condition (g_strdup (classname), g_strdup ("objectid"),
+ g_strdup ("="), g_strdup (key));
+ q->conditions = g_list_append (q->conditions, condition);
+ return (q);
+}
-/* SELECT * from classname */
+/* ------------------------------------------------------------------------- *\
+ * Create OQL query that loads all instances of a class.
+\* ------------------------------------------------------------------------- */
_QueryData *
-oql_load_object(configuration config, const char *classname)
- {
- GList *l, *tmp, *parents;
- _QueryData *q = NULL;
- odl_class *c;
- /* int nnn = 0; */
-
- /* trace_functioncall(); */
- q = create_query_data(NULL);
- if (!q)
- {
- errormsg("Out of memory");
+oql_load_object (configuration config, const char *classname)
+{
+ GList *l, *tmp, *parents;
+ _QueryData *q = NULL;
+ odl_class *c;
+ /* int nnn = 0; */
+
+ q = create_query_data (NULL);
+ if (!q)
+ {
+ errormsg ("Out of memory");
return (NULL);
- }
- q->type = OQL_SELECT;
+ }
+ q->type = OQL_SELECT;
- c = odl_find_class(all_classes, classname, NULL);
- if (!c)
- {
- errormsg("Class %s not found", classname);
- oql_free_query(q);
+ c = odl_find_class (all_classes, classname, NULL);
+ if (!c)
+ {
+ errormsg ("Class %s not found", classname);
+ oql_free_query (q);
return (NULL);
- }
+ }
- add_order_by(q, c->orderby, FALSE);
- l = odl_class_get_fields(c, FT_basic);
- tmp = l;
- while (tmp)
- {
+ add_order_by (q, c->orderby, FALSE);
+ l = odl_class_get_fields (c, FT_basic);
+ tmp = l;
+ while (tmp)
+ {
char *fieldname;
- fieldname = g_strdup(odl_field_get_name((odl_field *) tmp->data));
- q->fields = g_list_append(q->fields, fieldname);
- tmp = g_list_next(tmp);
- }
- q->fields = g_list_sort(q->fields, (GCompareFunc) oql_sort_string_name);
-
- odl_fieldlist_free(l);
- q->classes = g_list_append(q->classes, g_strdup(classname));
-
- parents = odl_class_get_parentnames(c);
- if (parents)
- {
+ fieldname = g_strdup (odl_field_get_name ((odl_field *) tmp->data));
+ q->fields = g_list_append (q->fields, fieldname);
+ tmp = g_list_next (tmp);
+ }
+ q->fields = g_list_sort (q->fields, (GCompareFunc) oql_sort_string_name);
+
+ odl_fieldlist_free (l);
+ q->classes = g_list_append (q->classes, g_strdup (classname));
+
+ parents = odl_class_get_parentnames (c);
+ if (parents)
+ {
l = parents;
while (l)
- {
- q->classes = g_list_append(q->classes, g_strdup(l->data));
- l = g_list_next(l);
- }
- odl_namelist_free(parents);
- }
+ {
+ q->classes = g_list_append (q->classes, g_strdup (l->data));
+ l = g_list_next (l);
+ }
+ odl_namelist_free (parents);
+ }
- return (q);
- }
+ return (q);
+}
-/* WHERE (loadclass.fieldname relation value) */
+/* ------------------------------------------------------------------------- *\
+ * Add query constraint to OQL query.
+\* ------------------------------------------------------------------------- */
gboolean
-do_oql_add_query_constraint(_QueryData * q, const char *loadclass,
- const char *fieldname, const char *relation,
- const char *value, enum querytest test, gboolean
casesensitive)
- {
- _QueryCondition *condition;
-
- /* trace_functioncall(); */
- if (!q)
- return (FALSE);
-
- condition = create_query_condition(g_strdup(loadclass),
g_strdup(fieldname), g_strdup(relation), g_strdup(value));
- condition->test = test;
- condition->casesensitive = casesensitive;
- q->conditions = g_list_append(q->conditions, condition);
- return (TRUE);
- }
+do_oql_add_query_constraint (_QueryData * q, const char *loadclass,
+ const char *fieldname, const char *relation,
+ const char *value, enum querytest test,
+ gboolean casesensitive)
+{
+ _QueryCondition *condition;
+
+ if (!q)
+ return (FALSE);
+
+ condition =
+ create_query_condition (g_strdup (loadclass), g_strdup (fieldname),
+ g_strdup (relation), g_strdup (value));
+ condition->test = test;
+ condition->casesensitive = casesensitive;
+ q->conditions = g_list_append (q->conditions, condition);
+ return (TRUE);
+}
-/* parse OQL query and create */
+
+/* ------------------------------------------------------------------------- *\
+ * Parse OQL query and create.
+\* ------------------------------------------------------------------------- */
_QueryData *
-oql_load(configuration config, const char *classname, const char *OQL_query)
- {
- /* trace_functioncall(); */
- fatal_error("OQL text queries not yet supported.");
- return NULL;
- }
+oql_load (configuration config, const char *classname, const char *OQL_query)
+{
+ fatal_error ("OQL text queries not yet supported.");
+ return NULL;
+}
+
-/* search for objects that have a particular value in a particular field */
+/* ------------------------------------------------------------------------- *\
+ * Create OQL query that searches for objects that have a particular value
+ * in a particular field.
+\* ------------------------------------------------------------------------- */
_QueryData *
-oql_objects_field_search(configuration config, const char *classname, const
char *field, const char *value)
- {
- _QueryData *q = oql_load_object(config, classname);
-
- /* trace_functioncall(); */
- if (q)
- {
+oql_objects_field_search (configuration config, const char *classname,
+ const char *field, const char *value)
+{
+ _QueryData *q = oql_load_object (config, classname);
+
+ if (q)
+ {
_QueryCondition *condition;
- condition = create_query_condition(g_strdup(classname), g_strdup(field),
g_strdup("="), g_strdup(value));
+ condition =
+ create_query_condition (g_strdup (classname), g_strdup (field),
+ g_strdup ("="), g_strdup (value));
if (condition)
- {
- q->conditions = g_list_append(q->conditions, condition);
- }
+ {
+ q->conditions = g_list_append (q->conditions, condition);
+ }
else
- {
- oql_free_query(q);
- return (NULL);
- }
+ {
+ oql_free_query (q);
+ return (NULL);
+ }
return (q);
- }
+ }
- return (NULL);
- }
+ return (NULL);
+}
+/* ------------------------------------------------------------------------- *\
+ * Add ordeby clause to OQL query.
+\* ------------------------------------------------------------------------- */
void
-add_order_by(_QueryData * query, const char *orderby, gboolean reverse)
- {
- /* static int count = 0; */
-
- /* trace_functioncall(); */
- if (query->orderby)
- g_free(query->orderby);
-
- query->reversesearch = reverse;
- if (orderby)
- {
- query->orderby = g_strdup(orderby);
- }
- else
- {
+add_order_by (_QueryData * query, const char *orderby, gboolean reverse)
+{
+ /* static int count = 0; */
+
+ if (query->orderby)
+ g_free (query->orderby);
+
+ query->reversesearch = reverse;
+ if (orderby)
+ {
+ query->orderby = g_strdup (orderby);
+ }
+ else
+ {
query->orderby = NULL;
- }
- }
+ }
+}
+/* ------------------------------------------------------------------------- *\
+ * Add limit clause to OQL query.
+\* ------------------------------------------------------------------------- */
void
-oql_limit_results( _QueryData *q , unsigned long int limit )
+oql_limit_results (_QueryData * q, unsigned long int limit)
{
- q->uselimit = TRUE;
- q->maxresults = limit;
+ q->uselimit = TRUE;
+ q->maxresults = limit;
}
+/* ------------------------------------------------------------------------- *\
+ * Create the OQL query structure.
+\* ------------------------------------------------------------------------- */
static _QueryData *
-create_query_data(const char *orderby)
- {
- _QueryData *q = (_QueryData *) g_new0(_QueryData, 1);
-
- /* trace_functioncall(); */
- if (q)
- {
+create_query_data (const char *orderby)
+{
+ _QueryData *q = (_QueryData *) g_new0 (_QueryData, 1);
+
+ if (q)
+ {
q->complex = NULL;
q->sql = NULL;
q->fields = NULL;
q->conditions = NULL;
q->classes = NULL;
if (orderby)
- q->orderby = g_strdup(orderby);
+ q->orderby = g_strdup (orderby);
else
- q->orderby = NULL;
+ q->orderby = NULL;
q->values = NULL;
-
+
q->uselimit = FALSE;
q->maxresults = 0;
- }
- return (q);
- }
+ }
+ return (q);
+}
+/* ------------------------------------------------------------------------- *\
+ * Create a _QueryCondition structure.
+\* ------------------------------------------------------------------------- */
static _QueryCondition *
-create_query_condition(const char *targetclass, const char *field, const char
*relation, const char *value)
- {
- _QueryCondition *c = (_QueryCondition *) g_new0(_QueryCondition, 1);
-
- /* trace_functioncall(); */
- if (c)
- {
- c->targetclass = (char *)targetclass;
- c->field = (char *)field;
- c->relation = (char *)relation;
- c->value = (char *)value;
+create_query_condition (const char *targetclass, const char *field,
+ const char *relation, const char *value)
+{
+ _QueryCondition *c = (_QueryCondition *) g_new0 (_QueryCondition, 1);
+
+ if (c)
+ {
+ c->targetclass = (char *) targetclass;
+ c->field = (char *) field;
+ c->relation = (char *) relation;
+ c->value = (char *) value;
c->casesensitive = TRUE;
c->test = q_hackish;
- }
- return (c);
- }
+ }
+ return (c);
+}
+/* ------------------------------------------------------------------------- *\
+ * Free the _QueryCondition structure.
+\* ------------------------------------------------------------------------- */
static void
-free_query_condition(_QueryCondition * c)
- {
- /* trace_functioncall(); */
- if (c)
- {
+free_query_condition (_QueryCondition * c)
+{
+ if (c)
+ {
if (c->targetclass)
- g_free(c->targetclass);
+ g_free (c->targetclass);
if (c->field)
- g_free(c->field);
+ g_free (c->field);
if (c->relation)
- g_free(c->relation);
+ g_free (c->relation);
if (c->value)
- g_free(c->value);
- g_free(c);
- }
- }
+ g_free (c->value);
+ g_free (c);
+ }
+}
+/* ------------------------------------------------------------------------- *\
+ * Sorts strings, used in sorting fields in an OQL query.
+\* ------------------------------------------------------------------------- */
int
-oql_sort_string_name(gpointer a, gpointer b)
- {
- return (g_strcasecmp(a, b));
- }
+oql_sort_string_name (gpointer a, gpointer b)
+{
+ return (g_strcasecmp (a, b));
+}
GHashTable *oql_reservedwords = NULL;
-/* 31 bit hash function */
+/* ------------------------------------------------------------------------- *\
+ * 31 bit hash function.
+\* ------------------------------------------------------------------------- */
guint
g_strcase_hash (gconstpointer key)
{
- const char *p = key;
- guint h = tolower(*p);
+ const char *p = key;
+ guint h = tolower (*p);
- if (h)
- for (p += 1; *p != '\0'; p++)
- h = (h << 5) - h + tolower(*p);
-
- return h;
+ if (h)
+ for (p += 1; *p != '\0'; p++)
+ h = (h << 5) - h + tolower (*p);
+
+ return h;
}
-gboolean
-g_strcase_equal (gconstpointer v1,gconstpointer v2)
+/* ------------------------------------------------------------------------- *\
+ * Are the strings equal.
+\* ------------------------------------------------------------------------- */
+gboolean
+g_strcase_equal (gconstpointer v1, gconstpointer v2)
{
- const gchar *string1 = v1;
- const gchar *string2 = v2;
+ const gchar *string1 = v1;
+ const gchar *string2 = v2;
- return g_strcasecmp (string1, string2) == 0;
+ return g_strcasecmp (string1, string2) == 0;
}
+/* ------------------------------------------------------------------------- *\
+ *
+\* ------------------------------------------------------------------------- */
void
-quick_reserved_word(const char *word, gboolean mysql, gboolean postgresql)
- {
- _sql_reserved_word *w = NULL;
-
- if (oql_reservedwords == NULL)
- {
- oql_reservedwords = g_hash_table_new(g_strcase_hash, g_strcase_equal);
- }
-
- w = g_hash_table_lookup(oql_reservedwords, word);
- if (!w)
- {
- w = g_new0(_sql_reserved_word, 1);
+quick_reserved_word (const char *word, gboolean mysql, gboolean postgresql)
+{
+ _sql_reserved_word *w = NULL;
+
+ if (oql_reservedwords == NULL)
+ {
+ oql_reservedwords = g_hash_table_new (g_strcase_hash, g_strcase_equal);
+ }
+
+ w = g_hash_table_lookup (oql_reservedwords, word);
+ if (!w)
+ {
+ w = g_new0 (_sql_reserved_word, 1);
if (w)
- {
- w->word = g_strdup(word);
- w->mysql = FALSE;
- w->postgresql = FALSE;
- if (!w->word)
+ {
+ w->word = g_strdup (word);
+ w->mysql = FALSE;
+ w->postgresql = FALSE;
+ if (!w->word)
{
- g_free(w);
- return ;
+ g_free (w);
+ return;
}
- g_hash_table_insert(oql_reservedwords, w->word, w);
- }
+ g_hash_table_insert (oql_reservedwords, w->word, w);
+ }
else
- return ;
- }
+ return;
+ }
- w->mysql = mysql;
- w->postgresql = postgresql;
- }
+ w->mysql = mysql;
+ w->postgresql = postgresql;
+}
+/* ------------------------------------------------------------------------- *\
+ *
+\* ------------------------------------------------------------------------- */
void
-add_reserved_word(const char *word, int dbtype, gboolean reserved)
- {
- _sql_reserved_word *w = NULL;
-
- if (oql_reservedwords == NULL)
- oql_reservedwords = g_hash_table_new(g_strcase_hash, g_strcase_equal);
-
- w = g_hash_table_lookup(oql_reservedwords, word);
- if (!w)
- {
- w = g_new0(_sql_reserved_word, 1);
+add_reserved_word (const char *word, int dbtype, gboolean reserved)
+{
+ _sql_reserved_word *w = NULL;
+
+ if (oql_reservedwords == NULL)
+ oql_reservedwords = g_hash_table_new (g_strcase_hash, g_strcase_equal);
+
+ w = g_hash_table_lookup (oql_reservedwords, word);
+ if (!w)
+ {
+ w = g_new0 (_sql_reserved_word, 1);
if (w)
- {
- w->word = g_strdup(word);
- w->mysql = FALSE;
- w->postgresql = FALSE;
- if (!w->word)
+ {
+ w->word = g_strdup (word);
+ w->mysql = FALSE;
+ w->postgresql = FALSE;
+ if (!w->word)
{
- g_free(w);
- return ;
+ g_free (w);
+ return;
}
- g_hash_table_insert(oql_reservedwords, w->word, w);
- }
+ g_hash_table_insert (oql_reservedwords, w->word, w);
+ }
else
- return ;
- }
- switch (dbtype)
- {
- case OQL_DBTYPE_MYSQL:
+ return;
+ }
+ switch (dbtype)
+ {
+ case OQL_DBTYPE_MYSQL:
w->mysql = reserved;
break;
- case OQL_DBTYPE_POSTGRESQL:
+ case OQL_DBTYPE_POSTGRESQL:
w->postgresql = reserved;
break;
- }
- }
+ }
+}
+/* ------------------------------------------------------------------------- *\
+ * Is the word a reserved word.
+\* ------------------------------------------------------------------------- */
gboolean
-is_word_reserved(const char *word, int dbtype)
- {
- _sql_reserved_word *w = NULL;
-
- w = g_hash_table_lookup(oql_reservedwords, word);
- if (!w)
- return (FALSE);
-
- switch (dbtype)
- {
- case OQL_DBTYPE_MYSQL:
+is_word_reserved (const char *word, int dbtype)
+{
+ _sql_reserved_word *w = NULL;
+
+ w = g_hash_table_lookup (oql_reservedwords, word);
+ if (!w)
+ return (FALSE);
+
+ switch (dbtype)
+ {
+ case OQL_DBTYPE_MYSQL:
return (w->mysql);
- case OQL_DBTYPE_POSTGRESQL:
+ case OQL_DBTYPE_POSTGRESQL:
return (w->postgresql);
- }
+ }
- return (FALSE);
- }
+ return (FALSE);
+}
+/* ------------------------------------------------------------------------- *\
+ * Create an OQL field.
+\* ------------------------------------------------------------------------- */
oql_field *
-oql_make_field(char *field, enum querytest test, char *value, gboolean
casesensitive, gboolean invert)
- {
- oql_field *f = g_new0(oql_field, 1);
-
- if (f)
- {
- f->field = g_strdup(field);
+oql_make_field (char *field, enum querytest test, char *value,
+ gboolean casesensitive, gboolean invert)
+{
+ oql_field *f = g_new0 (oql_field, 1);
+
+ if (f)
+ {
+ f->field = g_strdup (field);
f->test = test;
- f->value = g_strdup(value);
+ f->value = g_strdup (value);
f->casesensitive = casesensitive;
f->invert = invert;
- }
- return (f);
- }
+ }
+ return (f);
+}
+/* ------------------------------------------------------------------------- *\
+ * Create an OQL constraint.
+\* ------------------------------------------------------------------------- */
oql_constraint *
-oql_make_constraint(enum oql_logic logic)
- {
- oql_constraint *o = g_new0(oql_constraint, 1);
+oql_make_constraint (enum oql_logic logic)
+{
+ oql_constraint *o = g_new0 (oql_constraint, 1);
- if (o)
- {
+ if (o)
+ {
o->logic = logic;
o->fields = NULL;
o->constraints = NULL;
- }
- return (o);
- }
+ }
+ return (o);
+}
+/* ------------------------------------------------------------------------- *\
+ * Add the fields from a constraint.
+\* ------------------------------------------------------------------------- */
void
-oql_add_field(oql_constraint * c, oql_field * f)
- {
- c->fields = g_list_append(c->fields, f);
- }
+oql_add_field (oql_constraint * c, oql_field * f)
+{
+ c->fields = g_list_append (c->fields, f);
+}
+/* ------------------------------------------------------------------------- *\
+ * Add a constraint.
+\* ------------------------------------------------------------------------- */
void
-oql_add_constraint(oql_constraint * c, oql_constraint * addme)
- {
- c->constraints = g_list_append(c->constraints, addme);
- }
+oql_add_constraint (oql_constraint * c, oql_constraint * addme)
+{
+ c->constraints = g_list_append (c->constraints, addme);
+}
+/* ------------------------------------------------------------------------- *\
+ * Add complex constraint.
+\* ------------------------------------------------------------------------- */
gboolean
-oql_add_complex_constraint(_QueryData * q, oql_constraint * c)
- {
- q->complex = g_list_append(q->complex, c);
- return FALSE;
- }
+oql_add_complex_constraint (_QueryData * q, oql_constraint * c)
+{
+ q->complex = g_list_append (q->complex, c);
+ return FALSE;
+}
+/* ------------------------------------------------------------------------- *\
+ * Add complex conditions to SQL query.
+\* ------------------------------------------------------------------------- */
static void
-oql_add_complex_conditions_to_sql(_QueryData * q, DBType db, GString * buf)
- {
- GList *l;
- odl_class *cl;
- char *classname;
-
- if (!q)
- return ;
- if (!q->classes)
- return ;
- if (!q->classes->data)
- return ;
- classname = q->classes->data;
-
- l = q->complex;
- while (l)
- {
- g_string_append(buf, "(");
+oql_add_complex_conditions_to_sql (_QueryData * q, DBType db, GString * buf)
+{
+ GList *l;
+ odl_class *cl;
+ char *classname;
+
+ if (!q)
+ return;
+ if (!q->classes)
+ return;
+ if (!q->classes->data)
+ return;
+ classname = q->classes->data;
- cl = odl_find_class(all_classes, classname, NULL);
- oql_add_complex_constraint_to_sql(q, cl, db, l->data, buf);
+ l = q->complex;
+ while (l)
+ {
+ g_string_append (buf, "(");
+
+ cl = odl_find_class (all_classes, classname, NULL);
+ oql_add_complex_constraint_to_sql (q, cl, db, l->data, buf);
- g_string_append(buf, ")");
+ g_string_append (buf, ")");
if (l->next)
- g_string_append(buf, " AND ");
+ g_string_append (buf, " AND ");
l = l->next;
- }
- }
+ }
+}
+/* ------------------------------------------------------------------------- *\
+ * Add complex constraint to SQL query.
+\* ------------------------------------------------------------------------- */
static void
-oql_add_complex_constraint_to_sql(_QueryData * q, odl_class * cl, DBType db,
oql_constraint * c, GString * buf)
- {
- GList *l;
- /* gboolean need_and = FALSE; */
- char *logic;
- char *quoted;
- const char *classname = odl_class_get_full_name(cl);
- char *temp;
-
- if (c->logic == oql_and)
- logic = " AND ";
- else
- logic = " OR ";
+oql_add_complex_constraint_to_sql (_QueryData * q, odl_class * cl, DBType db,
+ oql_constraint * c, GString * buf)
+{
+ GList *l;
+ /* gboolean need_and = FALSE; */
+ char *logic;
+ char *quoted;
+ const char *classname = odl_class_get_full_name (cl);
+ char *temp;
+
+ if (c->logic == oql_and)
+ logic = " AND ";
+ else
+ logic = " OR ";
- /* add fields */
- l = c->fields;
+ /* add fields */
+ l = c->fields;
- while (l)
- {
+ while (l)
+ {
/* add this field */
oql_field *f = l->data;
/* field */
if (!f->casesensitive)
- {
- if (db == OQL_DBTYPE_MYSQL)
- g_string_append(buf, "upper(");
- else if (db == OQL_DBTYPE_POSTGRESQL)
- g_string_append(buf, "upper(rtrim(");
- }
-
- quoted = oql_quote_column(classname, f->field, db);
- g_string_append(buf, quoted);
- g_free(quoted);
+ {
+ if (db == OQL_DBTYPE_MYSQL)
+ g_string_append (buf, "upper(");
+ else if (db == OQL_DBTYPE_POSTGRESQL)
+ g_string_append (buf, "upper(rtrim(");
+ }
+
+ quoted = oql_quote_column (classname, f->field, db);
+ g_string_append (buf, quoted);
+ g_free (quoted);
if (!f->casesensitive)
- {
- if (db == OQL_DBTYPE_MYSQL)
- g_string_append(buf, ")");
- else if (db == OQL_DBTYPE_POSTGRESQL)
- g_string_append(buf, ",' '))");
- }
+ {
+ if (db == OQL_DBTYPE_MYSQL)
+ g_string_append (buf, ")");
+ else if (db == OQL_DBTYPE_POSTGRESQL)
+ g_string_append (buf, ",' '))");
+ }
/* test, and prepare 'quoted' with value, and extra characters needed by
the test */
switch (f->test)
- {
- case q_equals:
- if (f->invert)
- g_string_append(buf, "<>");
- else
- g_string_append(buf, "=");
- quoted = oql_quote_value(f->value, db);
- break;
- case q_lessthan:
- if (f->invert)
- g_string_append(buf, ">=");
- else
- g_string_append(buf, "<");
- quoted = oql_quote_value(f->value, db);
- break;
- case q_greaterthan:
- if (f->invert)
- g_string_append(buf, "<=");
- else
- g_string_append(buf, ">");
- quoted = oql_quote_value(f->value, db);
- break;
- case q_contains:
- if (f->invert)
- g_string_append(buf, " not like ");
- else
- g_string_append(buf, " like ");
- temp = g_strdup_printf("%%%s%%", f->value);
- quoted = oql_quote_value(temp, db);
- g_free(temp);
- break;
- case q_startswith:
- if (f->invert)
- g_string_append(buf, " not like ");
- else
- g_string_append(buf, " like ");
- temp = g_strdup_printf("%%%s", f->value);
- quoted = oql_quote_value(temp, db);
- g_free(temp);
- break;
- case q_endswith:
- if (f->invert)
- g_string_append(buf, " not like ");
- else
- g_string_append(buf, " like ");
- temp = g_strdup_printf("%s%%", f->value);
- quoted = oql_quote_value(temp, db);
- g_free(temp);
- break;
+ {
+ case q_equals:
+ if (f->invert)
+ g_string_append (buf, "<>");
+ else
+ g_string_append (buf, "=");
+ quoted = oql_quote_value (f->value, db);
+ break;
+ case q_lessthan:
+ if (f->invert)
+ g_string_append (buf, ">=");
+ else
+ g_string_append (buf, "<");
+ quoted = oql_quote_value (f->value, db);
+ break;
+ case q_greaterthan:
+ if (f->invert)
+ g_string_append (buf, "<=");
+ else
+ g_string_append (buf, ">");
+ quoted = oql_quote_value (f->value, db);
+ break;
+ case q_contains:
+ if (f->invert)
+ g_string_append (buf, " not like ");
+ else
+ g_string_append (buf, " like ");
+ temp = g_strdup_printf ("%%%s%%", f->value);
+ quoted = oql_quote_value (temp, db);
+ g_free (temp);
+ break;
+ case q_startswith:
+ if (f->invert)
+ g_string_append (buf, " not like ");
+ else
+ g_string_append (buf, " like ");
+ temp = g_strdup_printf ("%%%s", f->value);
+ quoted = oql_quote_value (temp, db);
+ g_free (temp);
+ break;
+ case q_endswith:
+ if (f->invert)
+ g_string_append (buf, " not like ");
+ else
+ g_string_append (buf, " like ");
+ temp = g_strdup_printf ("%s%%", f->value);
+ quoted = oql_quote_value (temp, db);
+ g_free (temp);
+ break;
case q_notequals:
/* TODO */
break;
@@ -1708,137 +1813,148 @@
case q_hackish:
/* TODO */
break;
- }
+ }
/* add the value to test */
if (!f->casesensitive)
- {
- if (db == OQL_DBTYPE_MYSQL)
- g_string_append(buf, "upper(");
- else if (db == OQL_DBTYPE_POSTGRESQL)
- g_string_append(buf, "upper(rtrim(");
- }
- g_string_append(buf, quoted);
+ {
+ if (db == OQL_DBTYPE_MYSQL)
+ g_string_append (buf, "upper(");
+ else if (db == OQL_DBTYPE_POSTGRESQL)
+ g_string_append (buf, "upper(rtrim(");
+ }
+ g_string_append (buf, quoted);
if (!f->casesensitive)
- {
- if (db == OQL_DBTYPE_MYSQL)
- g_string_append(buf, ")");
- else if (db == OQL_DBTYPE_POSTGRESQL)
- g_string_append(buf, ",' '))");
- }
+ {
+ if (db == OQL_DBTYPE_MYSQL)
+ g_string_append (buf, ")");
+ else if (db == OQL_DBTYPE_POSTGRESQL)
+ g_string_append (buf, ",' '))");
+ }
/* next */
if (l->next)
- g_string_append(buf, logic);
- l = g_list_next(l);
- }
-
- /* add sub constraints */
- if (c->fields && c->constraints)
- g_string_append(buf, logic);
-
- l = c->constraints;
- while (l)
- {
+ g_string_append (buf, logic);
+ l = g_list_next (l);
+ }
+
+ /* add sub constraints */
+ if (c->fields && c->constraints)
+ g_string_append (buf, logic);
+
+ l = c->constraints;
+ while (l)
+ {
/* add this constraint */
- g_string_append(buf, "(");
- oql_add_complex_constraint_to_sql(q, cl, db, l->data, buf);
- g_string_append(buf, ")");
+ g_string_append (buf, "(");
+ oql_add_complex_constraint_to_sql (q, cl, db, l->data, buf);
+ g_string_append (buf, ")");
/* next */
if (l->next)
- g_string_append(buf, logic);
- l = g_list_next(l);
- }
- }
+ g_string_append (buf, logic);
+ l = g_list_next (l);
+ }
+}
-/* convert a value from the GEAS internal format to a format used by the
database */
+/* ------------------------------------------------------------------------- *\
+ * Convert a value from the GEAS internal format to a format used by the
+ * database.
+\* ------------------------------------------------------------------------- */
char *
-oql_translate_for_write(char *value, odl_class * c, const char *fieldname, int
database)
- {
- odl_field *f;
-
- f = odl_class_get_field(c, fieldname);
- if (!f)
- {
- abort();
- return (g_strdup("")); /* don't like this,
much */
- }
-
- switch (odl_field_get_datatype(f))
- {
- case DT_date:
+oql_translate_for_write (char *value, odl_class * c, const char *fieldname,
+ int database)
+{
+ odl_field *f;
+
+ f = odl_class_get_field (c, fieldname);
+ if (!f)
+ {
+ abort ();
+ return (g_strdup ("")); /* don't like this, much */
+ }
+
+ switch (odl_field_get_datatype (f))
+ {
+ case DT_date:
/* if( database == OQL_DBTYPE_MYSQL ) { } else if( database ==
OQL_DBTYPE_POSTGRESQL ) { } */
- if (strlen(value) == 0)
- {
- debug_output(DEBUGLEVEL_8, "convert '%s' to '%s'", value,
"0001-01-01");
- return (g_strdup("0001-01-01"));
- }
- break;
- case DT_time:
- if (strlen(value) == 0)
- {
- debug_output(DEBUGLEVEL_8, "convert '%s' to '%s'", value,
"0001-01-01");
- return (g_strdup("00:00:00"));
- }
- break;
- case DT_datetime:
- if (strlen(value) == 0)
- {
- debug_output(DEBUGLEVEL_8, "convert '%s' to '%s'", value,
"0001-01-01");
- return (g_strdup("0001-01-01 00:00:00"));
- }
- break;
- default:
- break;
- }
-
- /* just passes data through */
- return g_strdup(value);
- }
+ if (strlen (value) == 0)
+ {
+ debug_output (DEBUGLEVEL_8, "convert '%s' to '%s'", value,
+ "0001-01-01");
+ return (g_strdup ("0001-01-01"));
+ }
+ break;
+ case DT_time:
+ if (strlen (value) == 0)
+ {
+ debug_output (DEBUGLEVEL_8, "convert '%s' to '%s'", value,
+ "0001-01-01");
+ return (g_strdup ("00:00:00"));
+ }
+ break;
+ case DT_datetime:
+ if (strlen (value) == 0)
+ {
+ debug_output (DEBUGLEVEL_8, "convert '%s' to '%s'", value,
+ "0001-01-01");
+ return (g_strdup ("0001-01-01 00:00:00"));
+ }
+ break;
+ default:
+ break;
+ }
-/* convert a value from a format used by a database to a format used by GEAS */
+ /* just passes data through */
+ return g_strdup (value);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Convert a value from a format used by a database to a format used by GEAS.
+\* ------------------------------------------------------------------------- */
char *
-oql_translate_from_read(char *value, odl_class * c, const char *fieldname, int
database)
- {
- odl_field *f;
-
- if( c == NULL ) return g_strdup(value);
-
- f = odl_class_get_field(c, fieldname);
- if (!f)
- {
- abort();
- return (g_strdup("")); /* don't like this,
much */
- }
- switch (odl_field_get_datatype(f))
- {
- case DT_date:
+oql_translate_from_read (char *value, odl_class * c, const char *fieldname,
+ int database)
+{
+ odl_field *f;
+
+ if (c == NULL)
+ return g_strdup (value);
+
+ f = odl_class_get_field (c, fieldname);
+ if (!f)
+ {
+ abort ();
+ return (g_strdup ("")); /* don't like this, much */
+ }
+ switch (odl_field_get_datatype (f))
+ {
+ case DT_date:
/* if( database == OQL_DBTYPE_MYSQL ) { } else if( database ==
OQL_DBTYPE_POSTGRESQL ) { } */
- if (strcmp(value, "0001-01-01") == 0)
- {
- debug_output(DEBUGLEVEL_8, "convert '%s' to '%s'", value, "");
- return (g_strdup(""));
- }
- break;
- case DT_time:
- if (strcmp(value, "00:00:00") == 0)
- {
- debug_output(DEBUGLEVEL_8, "convert '%s' to '%s'", value, "");
- return (g_strdup(""));
- }
- break;
- case DT_datetime:
- if (strcmp(value, "0001-01-01 00:00:00") == 0)
- {
- debug_output(DEBUGLEVEL_8, "convert '%s' to '%s'", value, "");
- return (g_strdup(""));
- }
- break;
- default:
- break;
- }
-
- /* just passes data through */
- return g_strdup(value);
- }
+ if (strcmp (value, "0001-01-01") == 0)
+ {
+ debug_output (DEBUGLEVEL_8, "convert '%s' to '%s'", value, "");
+ return (g_strdup (""));
+ }
+ break;
+ case DT_time:
+ if (strcmp (value, "00:00:00") == 0)
+ {
+ debug_output (DEBUGLEVEL_8, "convert '%s' to '%s'", value, "");
+ return (g_strdup (""));
+ }
+ break;
+ case DT_datetime:
+ if (strcmp (value, "0001-01-01 00:00:00") == 0)
+ {
+ debug_output (DEBUGLEVEL_8, "convert '%s' to '%s'", value, "");
+ return (g_strdup (""));
+ }
+ break;
+ default:
+ break;
+ }
+
+ /* just passes data through */
+ return g_strdup (value);
+}
- gnue/geas/src/oql oql.c,
Daniel E. Baumann <=