gboolean _midgard_dbobject_get_property (MidgardDBObject *self, const gchar *name, GValue *value) { g_return_val_if_fail (self != NULL, FALSE); g_return_val_if_fail (name != NULL, FALSE); g_return_val_if_fail (G_IS_VALUE (value), FALSE); if (!self->dbpriv->datamodel) return FALSE; GdaDataModel *model = GDA_DATA_MODEL (self->dbpriv->datamodel); if (!model || (model && !GDA_IS_DATA_MODEL (model))) return FALSE; gint col_idx = gda_data_model_get_column_index (model, name); if (col_idx == -1) return FALSE; const GValue *src_val = gda_data_model_get_value_at (model, col_idx, self->dbpriv->row, NULL); if (!src_val) return FALSE; if (!G_IS_VALUE (src_val) || (G_IS_VALUE (src_val) && G_VALUE_TYPE (src_val) == GDA_TYPE_NULL)) { /* NULL fetched from underlying field */ if (G_VALUE_HOLDS_STRING (value)) { g_value_set_string (value, ""); return TRUE; } g_warning ("Can not find value for given '%s' property \n", name); return FALSE; } if (G_VALUE_TYPE (src_val) != G_VALUE_TYPE (value)) g_value_transform (src_val, value); else g_value_copy (src_val, value); if (G_VALUE_HOLDS_STRING (value) && g_value_get_string (value) == NULL) g_value_set_string (value, ""); return TRUE; }
gboolean _midgard_dbobject_set_property (MidgardDBObject *self, const gchar *name, GValue *value) { g_return_val_if_fail (self != NULL, FALSE); g_return_val_if_fail (name != NULL, FALSE); g_return_val_if_fail (G_IS_VALUE (value), FALSE); GdaDataModel *model = GDA_DATA_MODEL (self->dbpriv->datamodel); if (!model) return FALSE; gint col_idx = gda_data_model_get_column_index (model, name); if (col_idx == -1) return FALSE; GError *error = NULL; gboolean rv = gda_data_model_set_value_at (model, col_idx, self->dbpriv->row, (const GValue *) value, &error); return rv; }
GPtrArray * symbol_db_util_get_files_with_zero_symbols (SymbolDBEngine *dbe) { SymbolDBEnginePriv *priv; GdaDataModel *data_model; GPtrArray *files_to_scan; const GdaStatement *stmt; gint i, num_rows = 0; g_return_val_if_fail (dbe != NULL, NULL); priv = dbe->priv; SDB_LOCK(priv); if ((stmt = sdb_engine_get_statement_by_query_id (dbe, PREP_QUERY_GET_ALL_FROM_FILE_WHERE_NOT_IN_SYMBOLS)) == NULL) { SDB_UNLOCK(priv); return NULL; } data_model = gda_connection_statement_execute_select (priv->db_connection, (GdaStatement*)stmt, NULL, NULL); if (!GDA_IS_DATA_MODEL (data_model) || (num_rows = gda_data_model_get_n_rows (GDA_DATA_MODEL (data_model))) <= 0) { if (data_model != NULL) g_object_unref (data_model); SDB_UNLOCK(priv); return NULL; } /* initialize the array */ files_to_scan = g_ptr_array_new_with_free_func (g_free); /* we can now scan each filename entry to check the last modification time. */ for (i = 0; i < num_rows; i++) { const GValue *value; const gchar *file_name; gchar *file_abs_path = NULL; if ((value = gda_data_model_get_value_at (data_model, gda_data_model_get_column_index(data_model, "db_file_path"), i, NULL)) == NULL) { continue; } /* build abs path. */ file_name = g_value_get_string (value); file_abs_path = symbol_db_util_get_full_local_path (dbe, file_name); g_ptr_array_add (files_to_scan, file_abs_path); } g_object_unref (data_model); SDB_UNLOCK(priv); return files_to_scan; }
void _midgard_dbobject_set_from_data_model (MidgardDBObject *self, GdaDataModel *model, gint row, guint column_id) { g_return_if_fail (self != NULL); g_return_if_fail (model != NULL); g_return_if_fail (row > -1); GError *error = NULL; /* Set user defined properties */ guint n_props; guint i; GParamSpec **pspecs = g_object_class_list_properties (G_OBJECT_GET_CLASS (self), &n_props); if (!pspecs) return; const GValue *pval; for (i = 1; i < n_props; i++) { const gchar *pname = pspecs[i]->name; if (!(pspecs[i]->flags & G_PARAM_WRITABLE)) { g_debug ("Ignoring read only property %s \n", pname); continue; } gint col_idx = gda_data_model_get_column_index (model, pname); if (col_idx == -1) continue; pval = gda_data_model_get_value_at (model, col_idx, row, &error); if (!pval) { g_warning ("Failed to get '%s' property value: %s", pname, error && error->message ? error->message : "Unknown reason"); continue; } /* Overwrite NULL values */ if (G_VALUE_TYPE (pval) == GDA_TYPE_NULL && pspecs[i]->value_type == G_TYPE_STRING) { g_object_set (G_OBJECT (self), pname, "", NULL); } else if (G_VALUE_TYPE (pval) == GDA_TYPE_BLOB && G_TYPE_FUNDAMENTAL (pspecs[i]->value_type) == G_TYPE_STRING) { gchar *stringified = midgard_core_query_binary_stringify ((GValue*)pval); g_object_set (G_OBJECT (self), pname, stringified, NULL); g_free (stringified); } else { g_object_set_property (G_OBJECT (self), pname, pval); } column_id++; } g_free (pspecs); /* Set metadata */ MidgardDBObject *dbobject = MIDGARD_DBOBJECT (self); MidgardMetadata *metadata = MGD_DBOBJECT_METADATA (dbobject); if (metadata) MIDGARD_DBOBJECT_GET_CLASS (MIDGARD_DBOBJECT (metadata))->dbpriv->set_from_data_model ( MIDGARD_DBOBJECT (metadata), model, row, column_id); return; }