/** * gda_select_alter_select_for_empty: * @stmt: a SELECT #GdaStatement * @error: (allow-none): a place to store errors, or %NULL * * Creates a new #GdaStatement, selecting the same data as @stmt, but which always returns an * empty (no row) data model. This is use dy database providers' implementations. * * Returns: (transfer full): a new #GdaStatement */ GdaStatement * gda_select_alter_select_for_empty (GdaStatement *stmt, G_GNUC_UNUSED GError **error) { GdaStatement *estmt; GdaSqlStatement *sqlst; GdaSqlStatementSelect *stsel; g_assert (gda_statement_get_statement_type (stmt) == GDA_SQL_STATEMENT_SELECT); g_object_get (G_OBJECT (stmt), "structure", &sqlst, NULL); g_assert (sqlst); if (sqlst->sql) { g_free (sqlst->sql); sqlst->sql = NULL; } stsel = (GdaSqlStatementSelect*) sqlst->contents; /* set the WHERE condition to "1 = 0" */ GdaSqlExpr *expr, *cond = stsel->where_cond; GdaSqlOperation *op; if (cond) gda_sql_expr_free (cond); cond = gda_sql_expr_new (GDA_SQL_ANY_PART (stsel)); stsel->where_cond = cond; op = gda_sql_operation_new (GDA_SQL_ANY_PART (cond)); cond->cond = op; op->operator_type = GDA_SQL_OPERATOR_TYPE_EQ; expr = gda_sql_expr_new (GDA_SQL_ANY_PART (op)); op->operands = g_slist_prepend (NULL, expr); g_value_set_int ((expr->value = gda_value_new (G_TYPE_INT)), 1); expr = gda_sql_expr_new (GDA_SQL_ANY_PART (op)); op->operands = g_slist_prepend (op->operands, expr); g_value_set_int ((expr->value = gda_value_new (G_TYPE_INT)), 0); /* replace any selected field which has a parameter with NULL */ gda_sql_any_part_foreach (GDA_SQL_ANY_PART (stsel), (GdaSqlForeachFunc) param_to_null_foreach, NULL, NULL); /* create new statement */ estmt = g_object_new (GDA_TYPE_STATEMENT, "structure", sqlst, NULL); gda_sql_statement_free (sqlst); return estmt; }
/* * rewrite_statement * * If @stmt contains some variables for which the g_type is undefined, try to adjust it * * Returns: a new #GdaStatement if no error occurred */ static GdaStatement * rewrite_statement (GdaReportEngine *engine, RunContext *context, GdaStatement *stmt, GError **error) { ForeachData fdata; fdata.engine = engine; fdata.context = context; GdaSqlStatement *sql_st; g_object_get (G_OBJECT (stmt), "structure", &sql_st, NULL); if (!gda_sql_any_part_foreach (GDA_SQL_ANY_PART (sql_st->contents), (GdaSqlForeachFunc) rewrite_statement_foreach_func, &fdata, error)) { gda_sql_statement_free (sql_st); return NULL; } GdaStatement *out_stmt; out_stmt = (GdaStatement*) g_object_new (GDA_TYPE_STATEMENT, "structure", sql_st, NULL); gda_sql_statement_free (sql_st); return out_stmt; }