1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
3 * symbol-db-model-file.c
4 * Copyright (C) Naba Kumar 2010 <naba@gnome.org>
6 * anjuta is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * anjuta is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 * See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include "symbol-db-engine.h"
21 #include "symbol-db-model-file.h"
23 #define SDB_MODEL_FILE_SQL " \
27 symbol.file_position, \
28 symbol.scope_definition_id, \
34 sym_access.access_name, \
35 sym_kind.is_container \
37 LEFT JOIN file ON symbol.file_defined_id = file.file_id \
38 LEFT JOIN sym_access ON symbol.access_kind_id = sym_access.access_kind_id \
39 LEFT JOIN sym_kind ON symbol.kind_id = sym_kind.sym_kind_id \
42 file.file_path = ## /* name:'filepath' type:gchararray */ \
43 AND symbol.scope_id = ## /* name:'parent' type:gint */ \
44 AND symbol.kind_id NOT IN \
48 WHERE sym_kind.kind_name = 'namespace' \
57 LEFT JOIN file ON symbol.file_defined_id = file.file_id \
59 file.file_path = ## /* name:'filepath' type:gchararray */ \
60 AND symbol.scope_id = ## /* name:'parent' type:gint */ \
61 AND symbol.kind_id IN \
65 WHERE sym_kind.kind_name = 'namespace' \
67 GROUP BY symbol.scope_definition_id \
73 symbol.scope_id = ## /* name:'parent' type:gint */ \
74 AND symbol.kind_id IN \
78 WHERE sym_kind.kind_name = 'class' \
80 AND symbol.scope_definition_id IN \
84 JOIN file ON symbol.file_defined_id = file.file_id \
85 WHERE file.file_path = ## /* name:'filepath' type:gchararray */ \
86 GROUP BY symbol.scope_id \
89 ORDER BY symbol.name \
90 LIMIT ## /* name:'limit' type:gint */ \
91 OFFSET ## /* name:'offset' type:gint */ \
94 struct _SymbolDBModelFilePriv
97 guint refresh_queue_id
;
100 GdaHolder
*param_file_path
, *param_parent_id
, *param_limit
, *param_offset
;
106 PROP_SYMBOL_DB_FILE_PATH
109 G_DEFINE_TYPE (SymbolDBModelFile
, sdb_model_file
,
110 SYMBOL_DB_TYPE_MODEL_PROJECT
);
113 sdb_model_file_update_sql_stmt (SymbolDBModel
*model
)
116 SymbolDBModelFilePriv
*priv
;
118 g_return_if_fail (SYMBOL_DB_IS_MODEL_FILE (model
));
119 priv
= SYMBOL_DB_MODEL_FILE (model
)->priv
;
121 g_object_get (model
, "symbol-db-engine", &dbe
, NULL
);
122 priv
->stmt
= symbol_db_engine_get_statement (dbe
, SDB_MODEL_FILE_SQL
);
123 gda_statement_get_parameters (priv
->stmt
, &priv
->params
, NULL
);
124 priv
->param_file_path
= gda_set_get_holder (priv
->params
, "filepath");
125 priv
->param_parent_id
= gda_set_get_holder (priv
->params
, "parent");
126 priv
->param_limit
= gda_set_get_holder (priv
->params
, "limit");
127 priv
->param_offset
= gda_set_get_holder (priv
->params
, "offset");
131 sdb_model_file_get_children (SymbolDBModel
*model
, gint tree_level
,
132 GValue column_values
[], gint offset
,
136 SymbolDBModelFilePriv
*priv
;
138 const gchar
*relative_path
= NULL
;
142 g_return_val_if_fail (SYMBOL_DB_IS_MODEL_FILE (model
), 0);
143 priv
= SYMBOL_DB_MODEL_FILE (model
)->priv
;
145 g_object_get (model
, "symbol-db-engine", &dbe
, NULL
);
147 /* If engine is not connected, there is nothing we can show */
148 if (!dbe
|| !symbol_db_engine_is_connected (dbe
) || !priv
->file_path
)
151 /* Determin node parent */
158 parent_id
= g_value_get_int
159 (&column_values
[SYMBOL_DB_MODEL_PROJECT_COL_SCOPE_DEFINITION_ID
]);
163 sdb_model_file_update_sql_stmt (model
);
165 relative_path
= symbol_db_util_get_file_db_path (dbe
, priv
->file_path
);
167 /* Initialize parameters */
168 g_value_init (&ival
, G_TYPE_INT
);
169 g_value_init (&sval
, G_TYPE_STRING
);
170 g_value_set_int (&ival
, parent_id
);
171 gda_holder_set_value (priv
->param_parent_id
, &ival
, NULL
);
172 g_value_set_int (&ival
, limit
);
173 gda_holder_set_value (priv
->param_limit
, &ival
, NULL
);
174 g_value_set_int (&ival
, offset
);
175 gda_holder_set_value (priv
->param_offset
, &ival
, NULL
);
176 g_value_set_static_string (&sval
, relative_path
);
177 gda_holder_set_value (priv
->param_file_path
, &sval
, NULL
);
178 g_value_reset (&sval
);
180 return symbol_db_engine_execute_select (dbe
, priv
->stmt
, priv
->params
);
184 sdb_model_file_get_n_children (SymbolDBModel
*model
, gint tree_level
,
185 GValue column_values
[])
188 GdaDataModel
*data_model
;
190 data_model
= sdb_model_file_get_children (model
, tree_level
,
193 if (GDA_IS_DATA_MODEL (data_model
))
195 n_children
= gda_data_model_get_n_rows (data_model
);
196 g_object_unref (data_model
);
202 sdb_model_file_refresh_idle (gpointer object
)
204 SymbolDBModelFilePriv
*priv
;
205 priv
= SYMBOL_DB_MODEL_FILE (object
)->priv
;
206 symbol_db_model_update (SYMBOL_DB_MODEL (object
));
207 priv
->refresh_queue_id
= 0;
212 sdb_model_file_set_property (GObject
*object
, guint prop_id
,
213 const GValue
*value
, GParamSpec
*pspec
)
215 gchar
*old_file_path
;
216 SymbolDBModelFilePriv
*priv
;
218 g_return_if_fail (SYMBOL_DB_IS_MODEL_FILE (object
));
219 priv
= SYMBOL_DB_MODEL_FILE (object
)->priv
;
223 case PROP_SYMBOL_DB_FILE_PATH
:
224 old_file_path
= priv
->file_path
;
225 priv
->file_path
= g_value_dup_string (value
);
226 if (g_strcmp0 (old_file_path
, priv
->file_path
) != 0)
228 if (!priv
->refresh_queue_id
)
229 priv
->refresh_queue_id
=
230 g_idle_add (sdb_model_file_refresh_idle
, object
);
232 g_free (old_file_path
);
235 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
241 sdb_model_file_get_property (GObject
*object
, guint prop_id
,
242 GValue
*value
, GParamSpec
*pspec
)
244 SymbolDBModelFilePriv
*priv
;
246 g_return_if_fail (SYMBOL_DB_IS_MODEL_FILE (object
));
247 priv
= SYMBOL_DB_MODEL_FILE (object
)->priv
;
251 case PROP_SYMBOL_DB_FILE_PATH
:
252 g_value_set_string (value
, priv
->file_path
);
255 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
261 sdb_model_file_finalize (GObject
*object
)
263 SymbolDBModelFilePriv
*priv
;
265 g_return_if_fail (SYMBOL_DB_IS_MODEL_FILE (object
));
266 priv
= SYMBOL_DB_MODEL_FILE (object
)->priv
;
267 g_free (priv
->file_path
);
270 g_object_unref (priv
->stmt
);
271 g_object_unref (priv
->params
);
273 if (priv
->refresh_queue_id
)
274 g_source_remove (priv
->refresh_queue_id
);
277 G_OBJECT_CLASS (sdb_model_file_parent_class
)->finalize (object
);
281 sdb_model_file_init (SymbolDBModelFile
*object
)
283 SymbolDBModelFilePriv
*priv
;
285 g_return_if_fail (SYMBOL_DB_IS_MODEL_FILE (object
));
287 priv
= g_new0 (SymbolDBModelFilePriv
, 1);
290 priv
->file_path
= NULL
;
294 sdb_model_file_class_init (SymbolDBModelFileClass
*klass
)
296 GObjectClass
* object_class
= G_OBJECT_CLASS (klass
);
297 SymbolDBModelClass
* model_class
= SYMBOL_DB_MODEL_CLASS (klass
);
299 object_class
->finalize
= sdb_model_file_finalize
;
300 object_class
->set_property
= sdb_model_file_set_property
;
301 object_class
->get_property
= sdb_model_file_get_property
;
303 model_class
->get_n_children
= sdb_model_file_get_n_children
;
304 model_class
->get_children
= sdb_model_file_get_children
;
306 g_object_class_install_property
307 (object_class
, PROP_SYMBOL_DB_FILE_PATH
,
308 g_param_spec_string ("file-path",
310 "Absolute file path for which symbols are shown",
311 NULL
, G_PARAM_READABLE
| G_PARAM_WRITABLE
));
315 symbol_db_model_file_new (SymbolDBEngine
* dbe
)
317 return GTK_TREE_MODEL (g_object_new (SYMBOL_DB_TYPE_MODEL_FILE
,
318 "symbol-db-engine", dbe
, NULL
));