/** * gda_sql_select_field_copy * @field: a #GdaSqlSelectField structure to be copied * * Creates a new #GdaSqlSelectField structure initiated with the values stored in @field. * * Returns: a new #GdaSqlSelectField structure. */ GdaSqlSelectField * gda_sql_select_field_copy (GdaSqlSelectField *field) { GdaSqlSelectField *copy; if (!field) return NULL; copy = gda_sql_select_field_new (NULL); copy->expr = gda_sql_expr_copy (field->expr); gda_sql_any_part_set_parent (copy->expr, copy); if (field->field_name) copy->field_name = g_strdup (field->field_name); if (field->table_name) copy->table_name = g_strdup (field->table_name); if (field->as) copy->as = g_strdup (field->as); copy->validity_meta_object = field->validity_meta_object; copy->validity_meta_table_column = field->validity_meta_table_column; return copy; }
/* Create GdaSqlSelectField for every property registered for the class. */ void _add_fields_to_select_statement (MidgardDBObjectClass *klass, MidgardConnection *mgd, GdaSqlStatementSelect *select, const gchar *table_name) { guint n_prop; guint i; GdaSqlSelectField *select_field; GdaSqlExpr *expr; GValue *val; gchar *table_field; GdaConnection *cnc = mgd->priv->connection; GParamSpec **pspecs = g_object_class_list_properties (G_OBJECT_CLASS (klass), &n_prop); if (!pspecs) return; const gchar *property_table = NULL; for (i = 0; i < n_prop; i++) { const gchar *property = pspecs[i]->name; const gchar *property_field = midgard_core_class_get_property_colname (klass, property); property_table = midgard_core_class_get_property_table (klass, property); if (property_table && table_name) property_table = table_name; /* Ignore properties with NULL storage and those of object type */ if (!property_table || pspecs[i]->value_type == G_TYPE_OBJECT) continue; select_field = gda_sql_select_field_new (GDA_SQL_ANY_PART (select)); /*select_field->field_name = g_strdup (property_field); select_field->table_name = g_strdup (property_table);*/ select_field->as = gda_connection_quote_sql_identifier (cnc, property); select->expr_list = g_slist_append (select->expr_list, select_field); expr = gda_sql_expr_new (GDA_SQL_ANY_PART (select_field)); val = g_new0 (GValue, 1); g_value_init (val, G_TYPE_STRING); gchar *q_table = gda_connection_quote_sql_identifier (cnc, property_table); gchar *q_field = gda_connection_quote_sql_identifier (cnc, property_field); table_field = g_strconcat (q_table, ".", q_field, NULL); g_value_set_string (val, table_field); g_free (q_table); g_free (q_field); g_free (table_field); expr->value = val; select_field->expr = expr; } g_free (pspecs); if (!klass->dbpriv->has_metadata) return; /* Check if metadata provides own method to add fields. If not, use given class storage. */ if (MIDGARD_IS_OBJECT_CLASS (klass)) { MidgardMetadataClass *mklass = MGD_DBCLASS_METADATA_CLASS (klass); if (!mklass) return; if (MIDGARD_DBOBJECT_CLASS (mklass)->dbpriv->add_fields_to_select_statement) { MIDGARD_DBOBJECT_CLASS (mklass)->dbpriv->add_fields_to_select_statement (MIDGARD_DBOBJECT_CLASS (mklass), mgd, select, table_name); return; } const gchar *table = midgard_core_class_get_table (klass); if (table_name) table = table_name; /* TODO, Once we stabilize use case, refactor this below to minimize code usage */ GParamSpec **pspecs = g_object_class_list_properties (G_OBJECT_CLASS (mklass), &n_prop); if (!pspecs) return; for (i = 0; i < n_prop; i++) { const gchar *property = pspecs[i]->name; const gchar *property_field = midgard_core_class_get_property_colname (MIDGARD_DBOBJECT_CLASS (mklass), property); if (pspecs[i]->value_type == G_TYPE_OBJECT || !property_field) continue; select_field = gda_sql_select_field_new (GDA_SQL_ANY_PART (select)); /*select_field->field_name = g_strdup (property_field); select_field->table_name = g_strdup (table);*/ select_field->as = g_strconcat ("metadata_", property, NULL); select->expr_list = g_slist_append (select->expr_list, select_field); expr = gda_sql_expr_new (GDA_SQL_ANY_PART (select_field)); val = g_new0 (GValue, 1); g_value_init (val, G_TYPE_STRING); table_field = g_strconcat (table, ".", property_field, NULL); g_value_set_string (val, table_field); g_free (table_field); expr->value = val; select_field->expr = expr; } g_free (pspecs); } return; }