gboolean __query_select_add_orders (MidgardQueryExecutor *self, GError **error) { if (!self->priv->orders) return TRUE; GSList *l = NULL; MidgardQueryExecutor *executor = MIDGARD_QUERY_EXECUTOR (self); GdaSqlStatement *sql_stm = executor->priv->stmt; GdaSqlStatementSelect *select = (GdaSqlStatementSelect *) sql_stm->contents; GdaSqlSelectOrder *order; for (l = MIDGARD_QUERY_EXECUTOR (self)->priv->orders; l != NULL; l = l->next) { /* Proper asc type is set during validation phase */ qso *_so = (qso*) l->data; /* Create new order */ order = gda_sql_select_order_new (GDA_SQL_ANY_PART (select)); order->asc = _so->asc; MidgardQueryProperty *property = _so->property; MidgardQueryStorage *storage = NULL; if (property->priv && property->priv->storage) storage = property->priv->storage; /* Compute table.colname for given property name */ GValue rval = {0, }; midgard_query_holder_get_value (MIDGARD_QUERY_HOLDER (property), &rval); GError *err = NULL; gchar *table_field = midgard_core_query_compute_constraint_property (executor, storage, g_value_get_string (&rval), &err); if (err) { g_propagate_error (error, err); g_free (table_field); gda_sql_select_order_free (order); return FALSE; } if (!table_field) { g_set_error (error, MIDGARD_VALIDATION_ERROR, MIDGARD_VALIDATION_ERROR_LOCATION_INVALID, "Can not find table and column name for given '%s' property name", g_value_get_string (&rval)); g_value_unset (&rval); return FALSE; } g_value_unset (&rval); GValue *value = g_new0 (GValue, 1); g_value_init (value, G_TYPE_STRING); g_value_take_string (value, table_field); /* Set order's expression and add new one to statement orders list */ GdaSqlExpr *expr = gda_sql_expr_new (GDA_SQL_ANY_PART (order)); expr->value = value; order->expr = expr; select->order_by = g_slist_append (select->order_by, order); } return TRUE; }
/** * gda_sql_select_order_copy * @order: a #GdaSqlSelectOrder structure to be copied * * Creates a new #GdaSqlSelectOrder structure initiated with the values stored in @order. * * Returns: a new #GdaSqlSelectOrder structure. */ GdaSqlSelectOrder * gda_sql_select_order_copy (GdaSqlSelectOrder *order) { GdaSqlSelectOrder *copy; if (!order) return NULL; copy = gda_sql_select_order_new (NULL); copy->expr = gda_sql_expr_copy (order->expr); gda_sql_any_part_set_parent (copy->expr, copy); if (order->collation_name) copy->collation_name = g_strdup (order->collation_name); copy->asc = order->asc; return copy; }