anjuta r3885 - in trunk: . plugins/document-manager plugins/language-support-cpp-java plugins/symbol-db plugins/symbol-db/test
- From: jhs svn gnome org
- To: svn-commits-list gnome org
- Subject: anjuta r3885 - in trunk: . plugins/document-manager plugins/language-support-cpp-java plugins/symbol-db plugins/symbol-db/test
- Date: Sat, 26 Apr 2008 10:18:02 +0100 (BST)
Author: jhs
Date: Sat Apr 26 09:18:02 2008
New Revision: 3885
URL: http://svn.gnome.org/viewvc/anjuta?rev=3885&view=rev
Log:
2008-04-26 2008-04-25 Massimo Cora\' <maxcvs email it>
* plugins/document-manager/plugin.c (on_document_update_ui):
* plugins/symbol-db/symbol-db-engine-iterator-node.c
(symbol_db_engine_iterator_node_get_symbol_extra_string):
* plugins/symbol-db/symbol-db-engine.c
(sdb_engine_get_statement_by_query_id), (gtree_compare_func),
(sdb_engine_get_dyn_query_node_by_id),
(sdb_engine_dyn_child_query_node_destroy),
(sdb_engine_insert_dyn_query_node_by_id),
(sdb_engine_free_cached_queries),
(sdb_engine_free_cached_dynamic_queries),
(sdb_engine_get_tuple_id_by_unique_name),
(sdb_engine_get_tuple_id_by_unique_name2),
(sdb_engine_get_tuple_id_by_unique_name3),
(sdb_engine_populate_db_by_tags),
(sdb_engine_timeout_trigger_signals), (sdb_engine_thread_monitor),
(sdb_engine_finalize), (symbol_db_engine_add_new_workspace),
(symbol_db_engine_add_new_project), (sdb_engine_add_new_language),
(sdb_engine_add_new_file), (sdb_engine_add_new_sym_type),
(sdb_engine_add_new_sym_kind), (sdb_engine_add_new_sym_access),
(sdb_engine_add_new_sym_implementation),
(sdb_engine_add_new_heritage),
(sdb_engine_add_new_scope_definition),
(sdb_engine_add_new_tmp_heritage_scope),
(sdb_engine_second_pass_update_scope_1),
(sdb_engine_second_pass_update_heritage),
(sdb_engine_second_pass_do), (sdb_engine_add_new_symbol),
(sdb_engine_detects_removed_ids), (sdb_engine_update_file),
(on_scan_update_files_symbols_end),
(symbol_db_engine_update_project_symbols),
(symbol_db_engine_get_full_local_path),
(symbol_db_engine_get_file_db_path),
(sdb_engine_walk_down_scope_path),
(symbol_db_engine_get_files_with_zero_symbols),
(sdb_engine_prepare_symbol_info_sql),
(symbol_db_engine_get_class_parents_by_symbol_id),
(symbol_db_engine_get_class_parents),
(symbol_db_engine_get_global_members_filtered),
(symbol_db_engine_get_scope_members_by_symbol_id_filtered),
(symbol_db_engine_get_scope_members_by_symbol_id),
(symbol_db_engine_get_scope_members),
(symbol_db_engine_get_current_scope),
(symbol_db_engine_get_file_symbols),
(symbol_db_engine_get_symbol_info_by_id),
(symbol_db_engine_find_symbol_by_name_pattern),
(symbol_db_engine_get_parent_scope_id_by_symbol_id),
(symbol_db_engine_find_symbol_by_name_pattern_filtered):
* plugins/symbol-db/symbol-db-engine.h:
* plugins/symbol-db/tables.sql:
new dynamic prepared queries architecture. Now every query used in the
engine has its own compiled query in libgda-sqlite provider. This for speed
improvements, code cleaning and auto-escaping of string parameters.
Lookup of dynamic queries takes care of sym_info parameters and of
parameters passed to functions. The compiled GdaStatements are stored in an
array of GTree (of GTree(s)). Some parameters, as the filter_kinds,
are bounded at n = 5, to avoid a third level of indirection on the store-trees.
* plugins/symbol-db/test/Makefile.am:
* plugins/symbol-db/test/main.c (get_parents), (get_current_scope),
(main):
re-enabled test.
Modified:
trunk/ChangeLog
trunk/plugins/document-manager/plugin.c
trunk/plugins/language-support-cpp-java/cpp-java-assist.c
trunk/plugins/symbol-db/symbol-db-engine-iterator-node.c
trunk/plugins/symbol-db/symbol-db-engine.c
trunk/plugins/symbol-db/symbol-db-engine.h
trunk/plugins/symbol-db/symbol-db-view.c
trunk/plugins/symbol-db/tables.sql
trunk/plugins/symbol-db/test/Makefile.am
trunk/plugins/symbol-db/test/main.c
Modified: trunk/plugins/document-manager/plugin.c
==============================================================================
--- trunk/plugins/document-manager/plugin.c (original)
+++ trunk/plugins/document-manager/plugin.c Sat Apr 26 09:18:02 2008
@@ -963,7 +963,7 @@
IAnjutaDocument *curdoc;
curdoc = anjuta_docman_get_current_document (ANJUTA_DOCMAN (plugin->docman));
- update_document_ui_undo_items (plugin, curdoc);
+ update_document_ui_undo_items (ANJUTA_PLUGIN(plugin), curdoc);
if (IANJUTA_IS_EDITOR (curdoc) && curdoc == doc)
{
Modified: trunk/plugins/language-support-cpp-java/cpp-java-assist.c
==============================================================================
--- trunk/plugins/language-support-cpp-java/cpp-java-assist.c (original)
+++ trunk/plugins/language-support-cpp-java/cpp-java-assist.c Sat Apr 26 09:18:02 2008
@@ -321,7 +321,7 @@
assist->priv->scope_context_cache = g_strdup (scope_context);
g_object_unref (iter);
}
- }
+ }
else if (g_str_equal (scope_operator, ".") ||
g_str_equal (scope_operator, "->"))
{
Modified: trunk/plugins/symbol-db/symbol-db-engine-iterator-node.c
==============================================================================
--- trunk/plugins/symbol-db/symbol-db-engine-iterator-node.c (original)
+++ trunk/plugins/symbol-db/symbol-db-engine-iterator-node.c Sat Apr 26 09:18:02 2008
@@ -219,7 +219,7 @@
else if (sym_info & SYMINFO_TYPE)
{
value = gda_data_model_iter_get_value_for_field (priv->data_iter,
- "type");
+ "type_type");
}
else if (sym_info & SYMINFO_TYPE_NAME)
{
Modified: trunk/plugins/symbol-db/symbol-db-engine.c
==============================================================================
--- trunk/plugins/symbol-db/symbol-db-engine.c (original)
+++ trunk/plugins/symbol-db/symbol-db-engine.c Sat Apr 26 09:18:02 2008
@@ -41,14 +41,14 @@
* get all symbols which have a scope_id of symbol X. X is a symbol of kind namespace,
class, struct etc. Symbol X can be retrieved by something like
select * from symbol join sym_type on symbol.type_id = sym_type.type_id where
-symbol.name = "First" and sym_type.type = "namespace";
+symbol.name = "First" and sym_type.type_type = "namespace";
our query is:
select * from symbol where scope_id = ;
at the end we have:
select * from symbol where scope_id = (select scope_definition_id from symbol join
sym_type on symbol.type_id = sym_type.type_id where symbol.name =
- "First" and sym_type.type = "namespace");
+ "First" and sym_type.type_type = "namespace");
------------------------
@@ -174,6 +174,10 @@
PREP_QUERY_HERITAGE_NEW,
PREP_QUERY_SCOPE_NEW,
PREP_QUERY_GET_SCOPE_ID,
+ PREP_QUERY_GET_PARENT_SCOPE_ID_BY_SYMBOL_ID_NO_FILE,
+ PREP_QUERY_GET_PARENT_SCOPE_ID_BY_SYMBOL_ID,
+ PREP_QUERY_GET_PARENT_SCOPE_ID_BY_SYMBOL_ID_BY_SYMBOL_ID,
+ PREP_QUERY_GET_SCOPE_DEFINITION_ID_BY_WALK_DOWN_SCOPE_PATH,
PREP_QUERY_TMP_HERITAGE_NEW,
PREP_QUERY_GET_ALL_FROM_TMP_HERITAGE,
PREP_QUERY_GET_ALL_FROM_TMP_HERITAGE_WITH_INHERITS,
@@ -204,10 +208,6 @@
/* *MUST* respect query_type enum order. */
-/* FIXME: 'LIMIT' keyword. This can be used to
- * speed up some select(s). Please upgrade them as soon as the library support
- * it.
- */
static query_node query_list[PREP_QUERY_COUNT] = {
/* -- workspace -- */
{
@@ -221,7 +221,7 @@
{
PREP_QUERY_GET_WORKSPACE_ID_BY_UNIQUE_NAME,
"SELECT workspace_id FROM workspace WHERE workspace_name = ## /* name:'wsname' "
- "type:gchararray */",
+ "type:gchararray */ LIMIT 1",
NULL,
NULL
},
@@ -237,7 +237,7 @@
{
PREP_QUERY_GET_PROJECT_ID_BY_UNIQUE_NAME,
"SELECT project_id FROM project WHERE project_name = ## /* name:'prjname' "
- "type:gchararray */",
+ "type:gchararray */ LIMIT 1",
NULL,
NULL
},
@@ -261,7 +261,7 @@
{
PREP_QUERY_GET_FILE_ID_BY_UNIQUE_NAME,
"SELECT file_id FROM file WHERE file_path = ## /* name:'filepath' "
- "type:gchararray */",
+ "type:gchararray */ LIMIT 1",
NULL,
NULL
},
@@ -306,23 +306,23 @@
{
PREP_QUERY_GET_LANGUAGE_ID_BY_UNIQUE_NAME,
"SELECT language_id FROM language WHERE language_name = ## /* name:'langname' "
- "type:gchararray */",
+ "type:gchararray */ LIMIT 1",
NULL,
NULL
},
/* -- sym type -- */
{
PREP_QUERY_SYM_TYPE_NEW,
- "INSERT INTO sym_type (type, type_name) VALUES (## /* name:'type' "
+ "INSERT INTO sym_type (type_type, type_name) VALUES (## /* name:'type' "
"type:gchararray */, ## /* name:'typename' type:gchararray */)",
NULL,
NULL
},
{
PREP_QUERY_GET_SYM_TYPE_ID,
- "SELECT type_id FROM sym_type WHERE type = ## /* name:'type' "
+ "SELECT type_id FROM sym_type WHERE type_type = ## /* name:'type' "
"type:gchararray */ AND type_name = ## /* name:'typename' "
- "type:gchararray */",
+ "type:gchararray */ LIMIT 1",
NULL,
NULL
},
@@ -352,7 +352,7 @@
{
PREP_QUERY_GET_SYM_ACCESS_BY_UNIQUE_NAME,
"SELECT access_kind_id FROM sym_access WHERE access_name = ## /* "
- "name:'accesskind' type:gchararray */",
+ "name:'accesskind' type:gchararray */ LIMIT 1",
NULL,
NULL
},
@@ -367,7 +367,7 @@
{
PREP_QUERY_GET_SYM_IMPLEMENTATION_BY_UNIQUE_NAME,
"SELECT sym_impl_id FROM sym_implementation WHERE kind = ## /* "
- "name:'implekind' type:gchararray */",
+ "name:'implekind' type:gchararray */ LIMIT 1",
NULL,
NULL
},
@@ -390,7 +390,54 @@
{
PREP_QUERY_GET_SCOPE_ID,
"SELECT scope_id FROM scope WHERE scope_name = ## /* name:'scope' "
- "type:gchararray */ AND type_id = ## /* name:'typeid' type:gint */",
+ "type:gchararray */ AND type_id = ## /* name:'typeid' type:gint */ LIMIT 1",
+ NULL,
+ NULL
+ },
+ {
+ PREP_QUERY_GET_PARENT_SCOPE_ID_BY_SYMBOL_ID_NO_FILE,
+ "SELECT symbol.symbol_id, symbol.file_defined_id, "
+ "symbol.file_position, symbol.scope_definition_id, symbol.scope_id "
+ "FROM symbol WHERE symbol.scope_definition_id = ( "
+ "SELECT symbol.scope_id FROM symbol WHERE symbol.symbol_id = "
+ "## /* name:'symid' type:gint */) "
+ "AND symbol.scope_definition_id > 0",
+ NULL,
+ NULL
+ },
+ {
+ PREP_QUERY_GET_PARENT_SCOPE_ID_BY_SYMBOL_ID,
+ "SELECT symbol.symbol_id, symbol.file_defined_id, "
+ "symbol.file_position, symbol.scope_definition_id, symbol.scope_id "
+ "FROM symbol JOIN file "
+ "ON symbol.file_defined_id = file.file_id "
+ "WHERE symbol.scope_definition_id = ( "
+ "SELECT symbol.scope_id FROM symbol WHERE symbol.symbol_id = "
+ "## /* name:'symid' type:gint */) "
+ "AND symbol.scope_definition_id > 0 "
+ "AND file.file_path = ## /* name:'dbfile' type:gchararray */",
+ NULL,
+ NULL
+ },
+ {
+ PREP_QUERY_GET_PARENT_SCOPE_ID_BY_SYMBOL_ID_BY_SYMBOL_ID,
+ "SELECT symbol.scope_definition_id FROM symbol WHERE "
+ "file_defined_id = (SELECT file_defined_id FROM symbol WHERE symbol_id = "
+ "/* name:'scopedsymid' type:gint */) "
+ "AND file_position < (SELECT file_position FROM symbol WHERE symbol_id = "
+ "/* name:'scopedsymid' type:gint */) "
+ "ORDER BY file_position DESC",
+ NULL,
+ NULL
+ },
+ {
+ PREP_QUERY_GET_SCOPE_DEFINITION_ID_BY_WALK_DOWN_SCOPE_PATH,
+ "SELECT scope_definition_id FROM symbol "
+ "WHERE scope_id = /* name:'scopeid' type:gint */ AND scope_definition_id = ("
+ "SELECT scope.scope_id FROM scope "
+ "INNER JOIN sym_type ON scope.type_id = sym_type.type_id "
+ "WHERE sym_type.type_type = /* name:'symtype' type:gchararray */ "
+ "AND scope.scope_name = /* name:'scopename' type:gchararray */) LIMIT 1",
NULL,
NULL
},
@@ -446,7 +493,7 @@
{
PREP_QUERY_GET_SYMBOL_SCOPE_DEFINITION_ID,
"SELECT scope_definition_id FROM symbol JOIN sym_type ON symbol.type_id "
- "= sym_type.type_id WHERE sym_type.type = ## /* name:'tokenname' "
+ "= sym_type.type_id WHERE sym_type.type_type = ## /* name:'tokenname' "
"type:gchararray */ AND sym_type.type_name = ## /* name:'objectname' "
"type:gchararray */ LIMIT 1",
NULL,
@@ -455,8 +502,8 @@
{
PREP_QUERY_GET_SYMBOL_ID_BY_CLASS_NAME,
"SELECT symbol_id FROM symbol JOIN sym_type ON symbol.type_id = "
- "sym_type.type_id WHERE scope_id=0 AND sym_type.type='class' AND "
- "name = ## /* name:'klassname' type:gchararray */",
+ "sym_type.type_id WHERE scope_id=0 AND sym_type.type_type='class' AND "
+ "name = ## /* name:'klassname' type:gchararray */ LIMIT 1",
NULL,
NULL
},
@@ -466,7 +513,7 @@
"scope.scope_id JOIN sym_type ON scope.type_id = sym_type.type_id "
"WHERE symbol.name = /* name:'klassname' type:gchararray */ AND "
"scope.scope_name = /* name:'namespacename' type:gchararray */ AND "
- "sym_type.type='namespace'",
+ "sym_type.type_type='namespace'",
NULL,
NULL
},
@@ -481,7 +528,7 @@
PREP_QUERY_GET_SYMBOL_ID_BY_UNIQUE_INDEX_KEY,
"SELECT symbol_id FROM symbol WHERE name = ## /* name:'symname' "
"type:gchararray */ AND file_defined_id = ## /* name:'filedefid' "
- "type:gint */ AND type_id = ## /* name:'typeid' type:gint */",
+ "type:gint */ AND type_id = ## /* name:'typeid' type:gint */ LIMIT 1",
NULL,
NULL
},
@@ -531,6 +578,93 @@
}
};
+
+typedef enum {
+ DYN_PREP_QUERY_GET_CLASS_PARENTS = 0,
+ DYN_PREP_QUERY_GET_CLASS_PARENTS_BY_SYMBOL_ID,
+ DYN_PREP_QUERY_GET_GLOBAL_MEMBERS_FILTERED,
+ DYN_PREP_QUERY_GET_SCOPE_MEMBERS,
+ DYN_PREP_QUERY_GET_CURRENT_SCOPE,
+ DYN_PREP_QUERY_GET_FILE_SYMBOLS,
+ DYN_PREP_QUERY_GET_SYMBOL_INFO_BY_ID,
+ DYN_PREP_QUERY_FIND_SYMBOL_NAME_BY_PATTERN,
+ DYN_PREP_QUERY_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED,
+ DYN_PREP_QUERY_GET_SCOPE_MEMBERS_BY_SYMBOL_ID,
+ DYN_PREP_QUERY_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_FILTERED,
+ DYN_PREP_QUERY_COUNT
+
+} dyn_query_type;
+
+
+typedef struct _dyn_query_node {
+ dyn_query_type dyn_query_id;
+ GTree * sym_extra_info_gtree;
+ gboolean has_gtree_child;
+
+} dyn_query_node;
+
+typedef struct _ChildDynQueryNode {
+ gchar *query_str;
+ GdaStatement *stmt;
+ GdaSet *plist;
+
+} DynChildQueryNode;
+
+/* *MUST* respect dyn_query_type enum order. */
+static dyn_query_node dyn_query_list [DYN_PREP_QUERY_COUNT] = {
+ {
+ DYN_PREP_QUERY_GET_CLASS_PARENTS,
+ NULL,
+ TRUE
+ },
+ {
+ DYN_PREP_QUERY_GET_CLASS_PARENTS_BY_SYMBOL_ID,
+ NULL,
+ FALSE
+ },
+ {
+ DYN_PREP_QUERY_GET_GLOBAL_MEMBERS_FILTERED,
+ NULL,
+ TRUE
+ },
+ {
+ DYN_PREP_QUERY_GET_SCOPE_MEMBERS,
+ NULL,
+ FALSE
+ },
+ {
+ DYN_PREP_QUERY_GET_CURRENT_SCOPE,
+ NULL,
+ FALSE
+ },
+ {
+ DYN_PREP_QUERY_GET_FILE_SYMBOLS,
+ NULL,
+ FALSE
+ },
+ {
+ DYN_PREP_QUERY_GET_SYMBOL_INFO_BY_ID,
+ NULL,
+ FALSE
+ },
+ {
+ DYN_PREP_QUERY_FIND_SYMBOL_NAME_BY_PATTERN,
+ NULL,
+ FALSE
+ },
+ {
+ DYN_PREP_QUERY_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED,
+ NULL,
+ TRUE
+ },
+ {
+ DYN_PREP_QUERY_GET_SCOPE_MEMBERS_BY_SYMBOL_ID,
+ NULL,
+ TRUE
+ }
+};
+
+
typedef void (SymbolDBEngineCallback) (SymbolDBEngine * dbe,
gpointer user_data);
@@ -755,7 +889,7 @@
* A GdaSet will also be populated once, avoiding so to create again later on.
*/
static inline const GdaStatement *
-sdb_engine_get_query_by_id (SymbolDBEngine * dbe, query_type query_id)
+sdb_engine_get_statement_by_query_id (SymbolDBEngine * dbe, query_type query_id)
{
query_node *node;
SymbolDBEnginePriv *priv;
@@ -786,9 +920,189 @@
return node->stmt;
}
+
+static gint
+gtree_compare_func (gconstpointer a, gconstpointer b, gpointer user_data)
+{
+ return (gint)a - (gint)b;
+}
+
+/**
+ *
+ */
+static inline const DynChildQueryNode *
+sdb_engine_get_dyn_query_node_by_id (SymbolDBEngine *dbe, dyn_query_type query_id,
+ SymExtraInfo sym_info, gint other_parameters)
+{
+ dyn_query_node *node;
+ SymbolDBEnginePriv *priv;
+
+ priv = dbe->priv;
+
+ node = &dyn_query_list[query_id];
+
+/* DEBUG_PRINT ("sdb_engine_get_dyn_query_node_by_id (): query %d has_gtree_child %d"
+ "other_parameters %d, sym_info %d", query_id, node->has_gtree_child,
+ other_parameters, sym_info
+ );
+ */
+
+ if (node->sym_extra_info_gtree == NULL)
+ {
+ /* we didn't find any extra info symbol, nor it has been added before */
+ return NULL;
+ }
+
+ if (node->has_gtree_child == FALSE)
+ {
+/* DEBUG_PRINT ("sdb_engine_get_dyn_query_node_by_id (): %d has_gtree_child FALSE",
+ query_id);*/
+ /* use only sym_info as key, ignore other_parameters */
+ return g_tree_lookup (node->sym_extra_info_gtree, (gpointer)sym_info);
+ }
+ else {
+ GTree *child_gtree;
+
+ child_gtree = g_tree_lookup (node->sym_extra_info_gtree, (gpointer)sym_info);
+ if (child_gtree == NULL) {
+ DEBUG_PRINT ("child_gtree is null");
+ return NULL;
+ }
+
+ DynChildQueryNode *result;
+ result = g_tree_lookup (child_gtree, (gpointer)other_parameters);
+
+ return result;
+ }
+}
+
+
+static void
+sdb_engine_dyn_child_query_node_destroy (gpointer data)
+{
+ DynChildQueryNode *node_to_destroy;
+
+ node_to_destroy = (DynChildQueryNode *)data;
+
+ g_free (node_to_destroy->query_str);
+ g_object_unref (node_to_destroy->stmt);
+ g_object_unref (node_to_destroy->plist);
+ g_free (node_to_destroy);
+}
+
+
+/**
+ * WARNING: We suppose that before calling this function we already checked with
+ * sdb_engine_get_dyn_query_node_by_id () that the node we're going to add
+ * isn't yet inserted.
+ */
+static inline const DynChildQueryNode *
+sdb_engine_insert_dyn_query_node_by_id (SymbolDBEngine *dbe, dyn_query_type query_id,
+ SymExtraInfo sym_info, gint other_parameters,
+ const gchar *sql)
+{
+ dyn_query_node *node;
+ SymbolDBEnginePriv *priv;
+ priv = dbe->priv;
+
+ /* no way: if connection is NULL we will break here. There must be
+ * a connection established to db before using this function */
+ g_return_val_if_fail (priv->db_connection != NULL, NULL);
+
+ node = &dyn_query_list[query_id];
+
+ if (node->sym_extra_info_gtree == NULL)
+ {
+ /* lazy initialization */
+ if (node->has_gtree_child == FALSE)
+ {
+ node->sym_extra_info_gtree =
+ g_tree_new_full ((GCompareDataFunc)>ree_compare_func,
+ NULL,
+ NULL,
+ sdb_engine_dyn_child_query_node_destroy);
+ }
+ else
+ {
+ node->sym_extra_info_gtree = g_tree_new_full ((GCompareDataFunc)>ree_compare_func,
+ NULL,
+ NULL,
+ (GDestroyNotify)g_tree_destroy);
+ }
+ }
+
+ if (node->has_gtree_child == FALSE)
+ {
+ /* main GTree has direct DynChildQueryNode* as its leaves, other parameters
+ * will be ignored
+ */
+ DynChildQueryNode *dyn_node;
+
+ dyn_node = g_new0 (DynChildQueryNode, 1);
+
+ /* create a new GdaStatement */
+ dyn_node->stmt =
+ gda_sql_parser_parse_string (priv->sql_parser, sql, NULL,
+ NULL);
+
+ if (gda_statement_get_parameters ((GdaStatement*)dyn_node->stmt,
+ &dyn_node->plist, NULL) == FALSE)
+ {
+ g_warning ("Error on getting parameters for dyn %d", query_id);
+ }
+
+ dyn_node->query_str = g_strdup (sql);
+
+ DEBUG_PRINT ("inserting direct child into main_gtree");
+ /* insert it into gtree, thanks */
+ g_tree_insert (node->sym_extra_info_gtree, (gpointer)sym_info, dyn_node);
+
+ /* return it */
+ return dyn_node;
+ }
+ else {
+ /* ok, this is a slightly more complex case */
+ GTree *child_gtree;
+ DynChildQueryNode *dyn_node;
+
+ child_gtree = g_tree_new_full ((GCompareDataFunc)>ree_compare_func,
+ NULL,
+ NULL,
+ sdb_engine_dyn_child_query_node_destroy);
+
+ dyn_node = g_new0 (DynChildQueryNode, 1);
+
+ /* create a new GdaStatement */
+ dyn_node->stmt =
+ gda_sql_parser_parse_string (priv->sql_parser, sql, NULL,
+ NULL);
+
+ if (gda_statement_get_parameters ((GdaStatement*)dyn_node->stmt,
+ &dyn_node->plist, NULL) == FALSE)
+ {
+ g_warning ("Error on getting parameters for dyn %d", query_id);
+ }
+
+ dyn_node->query_str = g_strdup (sql);
+
+ DEBUG_PRINT ("inserting child into main_gtree's gtree child, "
+ "other_parameters %d, sym_info %d, dyn_node %p",
+ other_parameters, sym_info, dyn_node);
+
+ /* insert the dyn_node into child_gtree, then child_gtree into main_gtree */
+ g_tree_insert (child_gtree, (gpointer)other_parameters, dyn_node);
+
+ g_tree_insert (node->sym_extra_info_gtree, (gpointer)sym_info, child_gtree);
+
+ /* return it */
+ return dyn_node;
+ }
+
+}
+
/**
* Return a GdaSet of parameters calculated from the statement. It does not check
- * if it's null. You *must* be sure to have called sdb_engine_get_query_by_id () first.
+ * if it's null. You *must* be sure to have called sdb_engine_get_statement_by_query_id () first.
*/
static inline const GdaSet *
sdb_engine_get_query_parameters_list (SymbolDBEngine *dbe, query_type query_id)
@@ -798,34 +1112,15 @@
return node->plist;
}
-
-/* DEPRECATED, REMOVED.
-static inline gint
-sdb_engine_get_last_insert_id (SymbolDBEngine * dbe)
-{
- gint table_id;
- SymbolDBEnginePriv *priv;
- gchar *res;
-
- priv = dbe->priv;
- res = gda_connection_get_last_insert_id (priv->db_connection, NULL);
- table_id = atoi (res);
- g_free (res);
- return table_id;
-}
-*/
/**
* Clear the static cached queries data. You should call this function when closing/
* destroying SymbolDBEngine object.
*/
static void
-sdb_engine_free_cached_queries (SymbolDBEngine * dbe)
+sdb_engine_free_cached_queries ()
{
gint i;
query_node *node;
- SymbolDBEnginePriv *priv;
-
- priv = dbe->priv;
for (i = 0; i < PREP_QUERY_COUNT; i++)
{
@@ -845,6 +1140,25 @@
}
}
+static void
+sdb_engine_free_cached_dynamic_queries ()
+{
+ gint i;
+ dyn_query_node *node;
+
+ for (i = 0; i < DYN_PREP_QUERY_COUNT; i++)
+ {
+ node = &dyn_query_list[i];
+
+ if (node->sym_extra_info_gtree != NULL)
+ {
+ g_object_unref (node->sym_extra_info_gtree );
+ node->sym_extra_info_gtree = NULL;
+ }
+ }
+}
+
+
static gboolean
sdb_engine_disconnect_from_db (SymbolDBEngine * dbe)
{
@@ -887,7 +1201,7 @@
priv = dbe->priv;
/* get prepared query */
- if ((stmt = sdb_engine_get_query_by_id (dbe, qtype)) == NULL)
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe, qtype)) == NULL)
{
g_warning ("Query is null");
return -1;
@@ -949,7 +1263,7 @@
priv = dbe->priv;
/* get prepared query */
- if ((stmt = sdb_engine_get_query_by_id (dbe, qtype)) == NULL)
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe, qtype)) == NULL)
{
g_warning ("Query is null");
return -1;
@@ -1019,7 +1333,7 @@
priv = dbe->priv;
/* get prepared query */
- if ((stmt = sdb_engine_get_query_by_id (dbe, qtype)) == NULL)
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe, qtype)) == NULL)
{
g_warning ("Query is null");
return -1;
@@ -1123,7 +1437,6 @@
}
static GTimer *sym_timer_DEBUG = NULL;
-/*static gint files_scanned_DEBUG = 0; */
/**
* If fake_file is != NULL we claim and assert that tags contents which are
@@ -1141,7 +1454,6 @@
tagEntry tag_entry;
gint file_defined_id_cache = 0;
gchar* tag_entry_file_cache = NULL;
-/* GdaCommand *command;*/
SymbolDBEnginePriv *priv = dbe->priv;
@@ -1201,19 +1513,6 @@
DEBUG_PRINT ("elapsed: %f for (%d) [%f per symbol]", elapsed_DEBUG,
tags_total_DEBUG, elapsed_DEBUG / tags_total_DEBUG);
-/*
- if (files_scanned_DEBUG++ > 50)
- {
- DEBUG_PRINT ("analyzing...");
- command = gda_command_new ("ANALYZE", GDA_COMMAND_TYPE_SQL,
- GDA_COMMAND_OPTION_STOP_ON_ERRORS);
- gda_connection_execute_non_select_command (priv->db_connection,
- command, NULL, NULL);
- gda_command_free (command);
-
- files_scanned_DEBUG = 0;
- }
-*/
DEBUG_PRINT ("EMITTING single-file-scan-end");
/* notify listeners that another file has been scanned */
g_async_queue_push (priv->signals_queue, (gpointer)(SINGLE_FILE_SCAN_END +1));
@@ -1450,10 +1749,6 @@
priv->trigger_closure_retries++;
}
-/* DEBUG_PRINT ("priv->trigger_closure_retries %d g_queue_get_length (priv->thread_list) %d "
- "priv->thread_monitor_handler %d", priv->trigger_closure_retries ,
- g_queue_get_length (priv->thread_list), priv->thread_monitor_handler);*/
-
if (priv->thread_status == FALSE &&
priv->trigger_closure_retries > TRIGGER_MAX_CLOSURE_RETRIES &&
g_queue_get_length (priv->thread_list) <= 0 &&
@@ -1500,9 +1795,6 @@
priv->thread_closure_retries++;
}
-/* DEBUG_PRINT ("priv->thread_closure_retries %d g_queue_get_length (priv->thread_list) %d",
- priv->thread_closure_retries, g_queue_get_length (priv->thread_list));*/
-
if (priv->thread_closure_retries > THREAD_MAX_CLOSURE_RETRIES &&
g_queue_get_length (priv->thread_list) <= 0)
{
@@ -1829,7 +2121,7 @@
SymbolDBEngine *dbe;
SymbolDBEnginePriv *priv;
- dbe = SYMBOL_DB_ENGINE (object);
+ dbe = SYMBOL_DB_ENGINE (object);
priv = dbe->priv;
if (priv->timeout_trigger_handler > 0)
@@ -1839,7 +2131,8 @@
g_source_remove (priv->thread_monitor_handler);
sdb_engine_disconnect_from_db (dbe);
- sdb_engine_free_cached_queries (dbe);
+ sdb_engine_free_cached_queries ();
+ sdb_engine_free_cached_dynamic_queries ();
if (priv->scan_queue)
{
@@ -2238,7 +2531,7 @@
g_return_val_if_fail (priv->db_connection != NULL, FALSE);
if ((stmt =
- sdb_engine_get_query_by_id (dbe, PREP_QUERY_WORKSPACE_NEW)) == NULL)
+ sdb_engine_get_statement_by_query_id (dbe, PREP_QUERY_WORKSPACE_NEW)) == NULL)
{
g_warning ("query is null");
return FALSE;
@@ -2254,12 +2547,10 @@
gda_holder_set_value_str (param, NULL, workspace_name);
/* execute the query with parametes just set */
- GError *err = NULL;
if (gda_connection_statement_execute_non_select (priv->db_connection,
(GdaStatement*)stmt,
- (GdaSet*)plist, NULL, &err) == -1)
+ (GdaSet*)plist, NULL, NULL) == -1)
{
- DEBUG_PRINT ("Error: %s", err->message);
return FALSE;
}
@@ -2373,7 +2664,7 @@
/* insert new project */
if ((stmt =
- sdb_engine_get_query_by_id (dbe, PREP_QUERY_PROJECT_NEW)) == NULL)
+ sdb_engine_get_statement_by_query_id (dbe, PREP_QUERY_PROJECT_NEW)) == NULL)
{
g_warning ("query is null");
return FALSE;
@@ -2443,7 +2734,7 @@
GdaHolder *param;
GdaSet *last_inserted;
- if ((stmt = sdb_engine_get_query_by_id (dbe, PREP_QUERY_LANGUAGE_NEW))
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe, PREP_QUERY_LANGUAGE_NEW))
== NULL)
{
g_warning ("query is null");
@@ -2554,7 +2845,7 @@
language_id = sdb_engine_add_new_language (dbe, language);
- if ((stmt = sdb_engine_get_query_by_id (dbe, PREP_QUERY_FILE_NEW))
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe, PREP_QUERY_FILE_NEW))
== NULL)
{
g_warning ("query is null");
@@ -2667,9 +2958,9 @@
{
/*
CREATE TABLE sym_type (type_id integer PRIMARY KEY AUTOINCREMENT,
- type varchar (256) not null ,
+ type_type varchar (256) not null ,
type_name varchar (256) not null ,
- unique (type, type_name)
+ unique (type_type, type_name)
);
*/
const gchar *type;
@@ -2688,7 +2979,7 @@
type_name = tag_entry->name;
/* it does not exist. Create a new tuple. */
- if ((stmt = sdb_engine_get_query_by_id (dbe, PREP_QUERY_SYM_TYPE_NEW))
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe, PREP_QUERY_SYM_TYPE_NEW))
== NULL)
{
g_warning ("query is null");
@@ -2791,7 +3082,7 @@
GdaSet *last_inserted;
/* not found. Go on with inserting */
- if ((stmt = sdb_engine_get_query_by_id (dbe, PREP_QUERY_SYM_KIND_NEW))
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe, PREP_QUERY_SYM_KIND_NEW))
== NULL)
{
g_warning ("query is null");
@@ -2874,7 +3165,7 @@
/* not found. Go on with inserting */
if ((stmt =
- sdb_engine_get_query_by_id (dbe,
+ sdb_engine_get_statement_by_query_id (dbe,
PREP_QUERY_SYM_ACCESS_NEW)) == NULL)
{
g_warning ("query is null");
@@ -2955,7 +3246,7 @@
GdaSet *last_inserted;
/* not found. Go on with inserting */
- if ((stmt = sdb_engine_get_query_by_id (dbe,
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe,
PREP_QUERY_SYM_IMPLEMENTATION_NEW)) ==
NULL)
{
@@ -3015,7 +3306,7 @@
priv = dbe->priv;
- if ((stmt = sdb_engine_get_query_by_id (dbe, PREP_QUERY_HERITAGE_NEW))
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe, PREP_QUERY_HERITAGE_NEW))
== NULL)
{
g_warning ("query is null");
@@ -3093,7 +3384,7 @@
return -1;
}
- if ((stmt = sdb_engine_get_query_by_id (dbe, PREP_QUERY_SCOPE_NEW))
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe, PREP_QUERY_SCOPE_NEW))
== NULL)
{
g_warning ("query is null");
@@ -3254,7 +3545,7 @@
return -1;
- if ((stmt = sdb_engine_get_query_by_id (dbe, PREP_QUERY_TMP_HERITAGE_NEW))
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe, PREP_QUERY_TMP_HERITAGE_NEW))
== NULL)
{
g_warning ("query is null");
@@ -3442,7 +3733,7 @@
data_row);
symbol_referer_id = g_value_get_int (value_id2);
- if ((stmt = sdb_engine_get_query_by_id (dbe,
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe,
PREP_QUERY_UPDATE_SYMBOL_SCOPE_ID))
== NULL)
{
@@ -3752,7 +4043,7 @@
"symbol.scope_id=scope.scope_id JOIN sym_type ON "
"scope.type_id=sym_type.type_id WHERE "
"symbol.name='%s' AND scope.scope_name='%s' AND "
- "sym_type.type='namespace'",
+ "sym_type.type_type='namespace'",
klass_name, namespace_name);
if ((base_data =
@@ -3806,7 +4097,7 @@
/* prepare for scope second scan */
if ((stmt1 =
- sdb_engine_get_query_by_id (dbe,
+ sdb_engine_get_statement_by_query_id (dbe,
PREP_QUERY_GET_ALL_FROM_TMP_HERITAGE))
== NULL)
{
@@ -3836,7 +4127,7 @@
/* prepare for heritage second scan */
if ((stmt2 =
- sdb_engine_get_query_by_id (dbe,
+ sdb_engine_get_statement_by_query_id (dbe,
PREP_QUERY_GET_ALL_FROM_TMP_HERITAGE_WITH_INHERITS))
== NULL)
{
@@ -3866,7 +4157,7 @@
/* clean tmp heritage table */
if ((stmt3 =
- sdb_engine_get_query_by_id (dbe,
+ sdb_engine_get_statement_by_query_id (dbe,
PREP_QUERY_TMP_HERITAGE_DELETE_ALL))
== NULL)
{
@@ -4017,7 +4308,7 @@
gda_value_free (value3);
/* create specific query for a fresh new symbol */
- if ((stmt = sdb_engine_get_query_by_id (dbe, PREP_QUERY_SYMBOL_NEW))
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe, PREP_QUERY_SYMBOL_NEW))
== NULL)
{
g_warning ("query is null");
@@ -4066,7 +4357,7 @@
gda_value_free (value3);
/* create specific query for a fresh new symbol */
- if ((stmt = sdb_engine_get_query_by_id (dbe,
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe,
PREP_QUERY_UPDATE_SYMBOL_ALL))
== NULL)
{
@@ -4260,7 +4551,7 @@
/* ok, now we should read from __tmp_removed all the symbol ids which have
* been removed, and emit a signal
*/
- if ((stmt1 = sdb_engine_get_query_by_id (dbe,
+ if ((stmt1 = sdb_engine_get_statement_by_query_id (dbe,
PREP_QUERY_GET_REMOVED_IDS))
== NULL)
{
@@ -4306,7 +4597,7 @@
g_object_unref (data_model);
/* let's clean the tmp_table */
- if ((stmt2 = sdb_engine_get_query_by_id (dbe,
+ if ((stmt2 = sdb_engine_get_statement_by_query_id (dbe,
PREP_QUERY_TMP_REMOVED_DELETE_ALL))
== NULL)
{
@@ -4348,7 +4639,7 @@
/* Triggers will take care of updating/deleting connected symbols
* tuples, like sym_kind, sym_type etc */
- if ((stmt1 = sdb_engine_get_query_by_id (dbe,
+ if ((stmt1 = sdb_engine_get_statement_by_query_id (dbe,
PREP_QUERY_REMOVE_NON_UPDATED_SYMBOLS)) == NULL)
{
g_warning ("query is null");
@@ -4371,7 +4662,7 @@
sdb_engine_detects_removed_ids (dbe);
/* reset the update_flag to 0 */
- if ((stmt2 = sdb_engine_get_query_by_id (dbe,
+ if ((stmt2 = sdb_engine_get_statement_by_query_id (dbe,
PREP_QUERY_RESET_UPDATE_FLAG_SYMBOLS)) == NULL)
{
g_warning ("query is null");
@@ -4393,7 +4684,7 @@
/* last but not least, update the file analyse_time */
- if ((stmt3 = sdb_engine_get_query_by_id (dbe,
+ if ((stmt3 = sdb_engine_get_statement_by_query_id (dbe,
PREP_QUERY_UPDATE_FILE_ANALYSE_TIME))
== NULL)
{
@@ -4475,7 +4766,7 @@
GdaHolder *param;
/* and the project analyse_time */
- if ((stmt = sdb_engine_get_query_by_id (dbe,
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe,
PREP_QUERY_UPDATE_PROJECT_ANALYSE_TIME))
== NULL)
{
@@ -4707,7 +4998,7 @@
return FALSE;
}
- if ((stmt = sdb_engine_get_query_by_id (dbe,
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe,
PREP_QUERY_GET_ALL_FROM_FILE_BY_PROJECT_ID))
== NULL)
{
@@ -5085,6 +5376,45 @@
return priv->scanning_status;
}
+/* user must free the returned value */
+gchar*
+symbol_db_engine_get_full_local_path (SymbolDBEngine *dbe, const gchar* file)
+{
+ SymbolDBEnginePriv *priv;
+ gchar *full_path;
+
+ g_return_val_if_fail (dbe != NULL, NULL);
+
+ priv = dbe->priv;
+ full_path = g_strdup_printf ("%s%s", priv->db_directory, file);
+ return full_path;
+}
+
+gchar*
+symbol_db_engine_get_file_db_path (SymbolDBEngine *dbe, const gchar* full_local_file_path)
+{
+ SymbolDBEnginePriv *priv;
+ gchar *relative_path;
+ const gchar *tmp;
+ g_return_val_if_fail (dbe != NULL, NULL);
+
+ priv = dbe->priv;
+
+ if (priv->db_directory == NULL)
+ return NULL;
+
+ if (strlen (priv->db_directory) >= strlen (full_local_file_path))
+ {
+ return NULL;
+ }
+
+ tmp = full_local_file_path + strlen (priv->db_directory);
+ relative_path = strdup (tmp);
+
+ return relative_path;
+}
+
+
static inline gint
sdb_engine_walk_down_scope_path (SymbolDBEngine *dbe, const GPtrArray* scope_path)
{
@@ -5092,8 +5422,11 @@
gint final_definition_id;
gint scope_path_len;
gint i;
- gchar *query_str;
GdaDataModel *data;
+ const GdaSet *plist;
+ const GdaStatement *stmt;
+ GdaHolder *param;
+
g_return_val_if_fail (dbe != NULL, FALSE);
priv = dbe->priv;
@@ -5107,31 +5440,57 @@
return -1;
}
+ if ((stmt =
+ sdb_engine_get_statement_by_query_id (dbe,
+ PREP_QUERY_GET_SCOPE_DEFINITION_ID_BY_WALK_DOWN_SCOPE_PATH)) == NULL)
+ {
+ g_warning ("query is null");
+ return -1;
+ }
+
+ plist = sdb_engine_get_query_parameters_list (dbe,
+ PREP_QUERY_GET_SCOPE_DEFINITION_ID_BY_WALK_DOWN_SCOPE_PATH);
final_definition_id = 0;
for (i=0; i < scope_path_len -1; i = i + 2)
{
const GValue *value;
- DEBUG_PRINT ("loop final_definition_id %d", final_definition_id);
-
- query_str = g_strdup_printf ("SELECT scope_definition_id FROM symbol "
- "WHERE scope_id = '%d' AND scope_definition_id = ("
- "SELECT scope.scope_id FROM scope "
- "INNER JOIN sym_type ON scope.type_id = sym_type.type_id "
- "WHERE sym_type.type = '%s' "
- "AND scope.scope_name = '%s'"
- ")", final_definition_id, (gchar*)g_ptr_array_index (scope_path, i),
- (gchar*)g_ptr_array_index (scope_path, i + 1));
+ GValue *value_scope;
+
+ if ((param = gda_set_get_holder ((GdaSet*)plist, "symtype")) == NULL)
+ {
+ return -1;
+ }
+ gda_holder_set_value_str (param, NULL,
+ (gchar*)g_ptr_array_index (scope_path, i));
- DEBUG_PRINT ("walk down query is %s", query_str);
+ if ((param = gda_set_get_holder ((GdaSet*)plist, "scopename")) == NULL)
+ {
+ return -1;
+ }
+ gda_holder_set_value_str (param, NULL,
+ (gchar*)g_ptr_array_index (scope_path, i + 1));
- if ( (data = sdb_engine_execute_select_sql (dbe, query_str)) == NULL ||
- gda_data_model_get_n_rows (data) <= 0 )
+
+ if ((param = gda_set_get_holder ((GdaSet*)plist, "scopeid")) == NULL)
{
- g_free (query_str);
return -1;
}
+ value_scope = gda_value_new (G_TYPE_INT);
+ g_value_set_int (value_scope, final_definition_id);
+ gda_holder_set_value (param, value_scope);
+ gda_value_free (value_scope);
- g_free (query_str);
+ data = gda_connection_statement_execute_select (priv->db_connection,
+ (GdaStatement*)stmt,
+ (GdaSet*)plist, NULL);
+
+ if (!GDA_IS_DATA_MODEL (data) ||
+ gda_data_model_get_n_rows (GDA_DATA_MODEL (data)) <= 0)
+ {
+ if (data != NULL)
+ g_object_unref (data);
+ return -1;
+ }
value = gda_data_model_get_value_at (data, 0, 0);
if (G_VALUE_HOLDS (value, G_TYPE_INT))
@@ -5166,8 +5525,8 @@
SymbolDBEnginePriv *priv;
GdaDataModel *data_model;
GPtrArray *files_to_scan;
+ const GdaStatement *stmt;
gint i, num_rows = 0;
- gchar *query_str;
g_return_val_if_fail (dbe != NULL, NULL);
priv = dbe->priv;
@@ -5177,48 +5536,28 @@
g_mutex_lock (priv->mutex);
}
-/*
- FIXME: is this working within libgda-4x?
- if ((query = sdb_engine_get_query_by_id (dbe,
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe,
PREP_QUERY_GET_ALL_FROM_FILE_WHERE_NOT_IN_SYMBOLS))
== NULL)
{
- g_warning ("query is null");
- return NULL;
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
}
- if (GDA_QUERY_TYPE_NON_PARSED_SQL ==
- gda_query_get_query_type ((GdaQuery *) query))
+ data_model = gda_connection_statement_execute_select (priv->db_connection,
+ (GdaStatement*)stmt,
+ NULL, NULL);
+
+ if (!GDA_IS_DATA_MODEL (data_model) ||
+ gda_data_model_get_n_rows (GDA_DATA_MODEL (data_model)) <= 0)
{
- g_warning ("non parsed sql error");
+ if (data_model != NULL)
+ g_object_unref (data_model);
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
return NULL;
- }
-
- query_result = gda_query_execute
- ((GdaQuery *) query, NULL, FALSE, NULL);
-*/
- query_str = g_strdup_printf ("SELECT * FROM file WHERE file_id NOT IN (SELECT file_defined_id FROM symbol)");
- DEBUG_PRINT ("symbol_db_engine_get_files_with_zero_symbols () %s", query_str);
- if ( (data_model = sdb_engine_execute_select_sql (dbe, query_str)) == NULL ||
- (num_rows = gda_data_model_get_n_rows (data_model)) <= 0 )
- {
- if (priv->mutex)
- g_mutex_unlock (priv->mutex);
-
- return NULL;
- }
-
- /*
+ }
- if (!GDA_IS_DATA_MODEL (query_result) ||
- (num_rows = gda_data_model_get_n_rows (GDA_DATA_MODEL (query_result))) <= 0)
- {
- if (query_result != NULL)
- g_object_unref (query_result);
- query_result = NULL;
- return NULL;
- }*/
-
/* initialize the array */
files_to_scan = g_ptr_array_new ();
@@ -5246,7 +5585,6 @@
g_ptr_array_add (files_to_scan, file_abs_path);
}
- g_free (query_str);
g_object_unref (data_model);
if (priv->mutex)
@@ -5272,15 +5610,16 @@
if (sym_info & SYMINFO_LANGUAGE)
{
- info_data = g_string_append (info_data, ",language.language_name AS language_name ");
+ info_data = g_string_append (info_data, ",language.language_name "
+ "AS language_name ");
join_data = g_string_append (join_data, "LEFT JOIN language ON "
"file.lang_id = language.language_id ");
}
if (sym_info & SYMINFO_IMPLEMENTATION)
{
- info_data = g_string_append (info_data, ",sym_implementation.implementation_name AS "
- "implementation_name ");
+ info_data = g_string_append (info_data, ",sym_implementation.implementation_name "
+ "AS implementation_name " );
join_data = g_string_append (join_data, "LEFT JOIN sym_implementation ON "
"symbol.implementation_kind_id = sym_implementation.sym_impl_id ");
}
@@ -5294,15 +5633,15 @@
if (sym_info & SYMINFO_KIND)
{
- info_data = g_string_append (info_data, ",sym_kind.kind_name AS kind_name ");
+ info_data = g_string_append (info_data, ",sym_kind.kind_name AS kind_name");
join_data = g_string_append (join_data, "LEFT JOIN sym_kind ON "
"symbol.kind_id = sym_kind.sym_kind_id ");
}
if (sym_info & SYMINFO_TYPE || sym_info & SYMINFO_TYPE_NAME)
{
- info_data = g_string_append (info_data, ",sym_type.type AS type, "
- "sym_type.type_name AS type_name ");
+ info_data = g_string_append (info_data, ",sym_type.type_type AS type_type, "
+ "sym_type.type_name AS type_name");
join_data = g_string_append (join_data, "LEFT JOIN sym_type ON "
"symbol.type_id = sym_type.type_id ");
}
@@ -5318,7 +5657,8 @@
if (sym_info & SYMINFO_FILE_IGNORE)
{
- info_data = g_string_append (info_data, ",file_ignore.type AS file_ignore_type");
+ info_data = g_string_append (info_data, ",file_ignore.file_ignore_type "
+ "AS ignore_type ");
join_data = g_string_append (join_data, "LEFT JOIN ext_ignore ON "
"ext_ignore.prj_id = project.project_id "
"LEFT JOIN file_ignore ON "
@@ -5327,7 +5667,8 @@
if (sym_info & SYMINFO_FILE_INCLUDE)
{
- info_data = g_string_append (info_data, ",file_include.type AS file_include_type ");
+ info_data = g_string_append (info_data, ",file_include.file_include_type "
+ "AS file_include_type ");
join_data = g_string_append (join_data, "LEFT JOIN ext_include ON "
"ext_include.prj_id = project.project_id "
"LEFT JOIN file_include ON "
@@ -5348,7 +5689,7 @@
/**
* Same behaviour as symbol_db_engine_get_class_parents () but this is quicker because
* of the child_klass_symbol_id, aka the derived class symbol_id.
- * Return an iterator (eventually) containing the base classes.
+ * Return an iterator (eventually) containing the base classes or NULL if error occurred.
*/
SymbolDBEngineIterator *
symbol_db_engine_get_class_parents_by_symbol_id (SymbolDBEngine *dbe,
@@ -5358,8 +5699,11 @@
SymbolDBEnginePriv *priv;
gchar *query_str;
GdaDataModel *data;
+ GdaHolder *param;
GString *info_data;
GString *join_data;
+ GValue *value;
+ const DynChildQueryNode *dyn_node;
g_return_val_if_fail (dbe != NULL, FALSE);
priv = dbe->priv;
@@ -5368,38 +5712,81 @@
{
g_mutex_lock (priv->mutex);
}
+
+ if ((dyn_node = sdb_engine_get_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_CLASS_PARENTS_BY_SYMBOL_ID, sym_info, 0)) == NULL)
+ {
- /* info_data contains the stuff after SELECT and befor FROM */
- info_data = g_string_new ("");
+ /* info_data contains the stuff after SELECT and befor FROM */
+ info_data = g_string_new ("");
- /* join_data contains the optionals joins to do to retrieve new data on other
- * tables.
- */
- join_data = g_string_new ("");
+ /* join_data contains the optionals joins to do to retrieve new data on other
+ * tables.
+ */
+ join_data = g_string_new ("");
+
+ /* fill info_data and join data with optional sql */
+ sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
+
+ query_str = g_strdup_printf("SELECT symbol.symbol_id,AS symbol_id "
+ "symbol.name AS name, symbol.file_position AS file_position, "
+ "symbol.is_file_scope AS is_file_scope, symbol.signature AS signature "
+ "%s FROM heritage "
+ "JOIN symbol ON heritage.symbol_id_base = symbol.symbol_id %s "
+ "WHERE heritage.symbol_id_derived = ## /* name:'childklassid' type:gint */",
+ info_data->str, join_data->str);
+
+ DEBUG_PRINT ("symbol_db_engine_get_class_parents_by_symbol_id query: %s",
+ query_str);
+
+ dyn_node = sdb_engine_insert_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_CLASS_PARENTS_BY_SYMBOL_ID,
+ sym_info, 0,
+ query_str);
+
+ g_free (query_str);
+ g_string_free (info_data, TRUE);
+ g_string_free (join_data, TRUE);
+ }
- /* fill info_data and join data with optional sql */
- sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
+ if (dyn_node == NULL)
+ {
+ DEBUG_PRINT ("dyn_node is NULL");
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
- query_str = g_strdup_printf("SELECT symbol.symbol_id, "
- "symbol.name, symbol.file_position, symbol.is_file_scope, "
- "symbol.signature %s FROM heritage "
- "JOIN symbol ON heritage.symbol_id_base = symbol.symbol_id %s "
- "WHERE heritage.symbol_id_derived = %d", info_data->str,
- join_data->str, child_klass_symbol_id);
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "childklassid")) == NULL)
+ {
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
+ value = gda_value_new (G_TYPE_INT);
+ g_value_set_int (value, child_klass_symbol_id);
+
+ gda_holder_set_value (param, value);
+ gda_value_free (value);
- DEBUG_PRINT ("symbol_db_engine_get_class_parents_by_symbol_id query: %s", query_str);
- if ( (data = sdb_engine_execute_select_sql (dbe, query_str)) == NULL ||
- gda_data_model_get_n_rows (data) <= 0 )
+ /* execute the query with parametes just set */
+ data = gda_connection_statement_execute_select (priv->db_connection,
+ (GdaStatement*)dyn_node->stmt,
+ (GdaSet*)dyn_node->plist, NULL);
+
+ if (!GDA_IS_DATA_MODEL (data) ||
+ gda_data_model_get_n_rows (data) <= 0)
{
- g_free (query_str);
+ if (data != NULL)
+ g_object_unref (data);
+
if (priv->mutex)
g_mutex_unlock (priv->mutex);
return NULL;
}
-
- g_free (query_str);
-
+
if (priv->mutex)
g_mutex_unlock (priv->mutex);
return (SymbolDBEngineIterator *)symbol_db_engine_iterator_new (data,
@@ -5413,6 +5800,9 @@
* symbol name.
* scope_path can be NULL.
*/
+#define DYN_GET_CLASS_PARENTS_EXTRA_PAR_FINAL_DEF_ZERO 1
+#define DYN_GET_CLASS_PARENTS_EXTRA_PAR_FINAL_DEF_POSITIVE 2
+
SymbolDBEngineIterator *
symbol_db_engine_get_class_parents (SymbolDBEngine *dbe, const gchar *klass_name,
const GPtrArray *scope_path, SymExtraInfo sym_info)
@@ -5420,13 +5810,15 @@
SymbolDBEnginePriv *priv;
gchar *query_str;
GdaDataModel *data;
+ GdaHolder *param;
GString *info_data;
GString *join_data;
gint final_definition_id;
+ const DynChildQueryNode *dyn_node;
g_return_val_if_fail (dbe != NULL, FALSE);
priv = dbe->priv;
-
+
if (priv->mutex)
{
g_mutex_lock (priv->mutex);
@@ -5436,59 +5828,118 @@
if (scope_path != NULL)
final_definition_id = sdb_engine_walk_down_scope_path (dbe, scope_path);
- /* info_data contains the stuff after SELECT and befor FROM */
- info_data = g_string_new ("");
+ if ((dyn_node = sdb_engine_get_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_CLASS_PARENTS, sym_info,
+ final_definition_id > 0 ?
+ DYN_GET_CLASS_PARENTS_EXTRA_PAR_FINAL_DEF_POSITIVE :
+ DYN_GET_CLASS_PARENTS_EXTRA_PAR_FINAL_DEF_ZERO)) == NULL)
+ {
+
+ /* info_data contains the stuff after SELECT and before FROM */
+ info_data = g_string_new ("");
- /* join_data contains the optionals joins to do to retrieve new data on other
- * tables.
- */
- join_data = g_string_new ("");
+ /* join_data contains the optionals joins to do to retrieve new data on other
+ * tables.
+ */
+ join_data = g_string_new ("");
- /* fill info_data and join data with optional sql */
- sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
+ /* fill info_data and join data with optional sql */
+ sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
- /* FIXME: as always prepared queries of this complexity gives
- GDA_QUERY_TYPE_NON_PARSED_SQL error. */
- if (final_definition_id > 0)
- {
- query_str = g_strdup_printf("SELECT symbol.symbol_id, "
- "symbol.name, symbol.file_position, symbol.is_file_scope, "
- "symbol.signature %s FROM heritage "
- "JOIN symbol ON heritage.symbol_id_base = symbol.symbol_id %s "
- "WHERE symbol_id_derived = ("
- "SELECT symbol_id FROM symbol "
- "JOIN sym_kind ON symbol.kind_id = sym_kind.sym_kind_id "
- "WHERE symbol.name = '%s' "
- "AND sym_kind.kind_name = 'class' "
- "AND symbol.scope_id = '%d'"
- ")", info_data->str, join_data->str, klass_name, final_definition_id);
+ if (final_definition_id > 0)
+ {
+ query_str = g_strdup_printf("SELECT symbol.symbol_id AS symbol_id, "
+ "symbol.name AS name, symbol.file_position AS file_position, "
+ "symbol.is_file_scope AS is_file_scope, symbol.signature AS signature "
+ "%s FROM heritage "
+ "JOIN symbol ON heritage.symbol_id_base = symbol.symbol_id %s "
+ "WHERE symbol_id_derived = ("
+ "SELECT symbol_id FROM symbol "
+ "JOIN sym_kind ON symbol.kind_id = sym_kind.sym_kind_id "
+ "WHERE symbol.name = ## /* name:'klassname' type:gchararray */ "
+ "AND sym_kind.kind_name = 'class' "
+ "AND symbol.scope_id = ## /* name:'defid' type:gint */"
+ ")", info_data->str, join_data->str);
+
+ dyn_node = sdb_engine_insert_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_CLASS_PARENTS,
+ sym_info, DYN_GET_CLASS_PARENTS_EXTRA_PAR_FINAL_DEF_POSITIVE,
+ query_str);
+ }
+ else
+ {
+ query_str = g_strdup_printf("SELECT symbol.symbol_id AS symbol_id, "
+ "symbol.name AS name, symbol.file_position AS file_position, "
+ "symbol.is_file_scope AS is_file_scope, "
+ "symbol.signature AS signature %s FROM heritage "
+ "JOIN symbol ON heritage.symbol_id_base = symbol.symbol_id %s "
+ "WHERE symbol_id_derived = ("
+ "SELECT symbol_id FROM symbol "
+ "JOIN sym_kind ON symbol.kind_id = sym_kind.sym_kind_id "
+ "WHERE symbol.name = ## /* name:'klassname' type:gchararray */ "
+ "AND sym_kind.kind_name = 'class' "
+ ")", info_data->str, join_data->str);
+
+ dyn_node = sdb_engine_insert_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_CLASS_PARENTS,
+ sym_info, DYN_GET_CLASS_PARENTS_EXTRA_PAR_FINAL_DEF_ZERO,
+ query_str);
+ }
+
+ g_free (query_str);
+ g_string_free (info_data, TRUE);
+ g_string_free (join_data, TRUE);
}
- else
+
+
+ if (dyn_node == NULL)
{
- query_str = g_strdup_printf("SELECT symbol.symbol_id, symbol.name, "
- "symbol.file_position, symbol.is_file_scope, "
- "symbol.signature %s FROM heritage "
- "JOIN symbol ON heritage.symbol_id_base = symbol.symbol_id %s "
- "WHERE symbol_id_derived = ("
- "SELECT symbol_id FROM symbol "
- "JOIN sym_kind ON symbol.kind_id = sym_kind.sym_kind_id "
- "WHERE symbol.name = '%s' "
- "AND sym_kind.kind_name = 'class' "
- ")", info_data->str, join_data->str, klass_name);
+ DEBUG_PRINT ("dyn_node is NULL");
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
}
- DEBUG_PRINT ("get parents query: %s", query_str);
-
- if ( (data = sdb_engine_execute_select_sql (dbe, query_str)) == NULL ||
- gda_data_model_get_n_rows (data) <= 0 )
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "klassname")) == NULL)
{
- g_free (query_str);
if (priv->mutex)
g_mutex_unlock (priv->mutex);
return NULL;
}
-
- g_free (query_str);
+ gda_holder_set_value_str (param, NULL, klass_name);
+
+ if (final_definition_id > 0)
+ {
+ GValue *value;
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "defid")) == NULL)
+ {
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
+ value = gda_value_new (G_TYPE_INT);
+ g_value_set_int (value, final_definition_id);
+
+ gda_holder_set_value (param, value);
+ gda_value_free (value);
+ }
+
+ /* execute the query with parametes just set */
+ data = gda_connection_statement_execute_select (priv->db_connection,
+ (GdaStatement*)dyn_node->stmt,
+ (GdaSet*)dyn_node->plist, NULL);
+
+ if (!GDA_IS_DATA_MODEL (data) ||
+ gda_data_model_get_n_rows (GDA_DATA_MODEL (data)) <= 0)
+ {
+ if (data != NULL)
+ g_object_unref (data);
+
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
if (priv->mutex)
g_mutex_unlock (priv->mutex);
@@ -5496,6 +5947,17 @@
priv->sym_type_conversion_hash);
}
+
+/**
+ * A maximum of 5 filter_kinds are admitted.
+ */
+#define DYN_GET_GLOBAL_MEMBERS_FILTERED_EXTRA_PAR_LIMIT 1
+#define DYN_GET_GLOBAL_MEMBERS_FILTERED_EXTRA_PAR_OFFSET 2
+#define DYN_GET_GLOBAL_MEMBERS_FILTERED_EXTRA_PAR_GROUP_YES 4
+#define DYN_GET_GLOBAL_MEMBERS_FILTERED_EXTRA_PAR_GROUP_NO 8
+#define DYN_GET_GLOBAL_MEMBERS_FILTERED_EXTRA_PAR_INCLUDE_KINDS_YES 16
+#define DYN_GET_GLOBAL_MEMBERS_FILTERED_EXTRA_PAR_INCLUDE_KINDS_NO 32
+
SymbolDBEngineIterator *
symbol_db_engine_get_global_members_filtered (SymbolDBEngine *dbe,
const GPtrArray *filter_kinds,
@@ -5514,7 +5976,12 @@
gboolean limit_free = FALSE;
gchar *offset = "";
gboolean offset_free = FALSE;
+ const DynChildQueryNode *dyn_node = NULL;
+ GdaHolder *param;
+ /* use to merge multiple extra_parameters flags */
+ gint other_parameters = 0;
+
g_return_val_if_fail (dbe != NULL, NULL);
priv = dbe->priv;
@@ -5528,92 +5995,130 @@
*/
sym_info = sym_info & ~SYMINFO_KIND;
- /* info_data contains the stuff after SELECT and befor FROM */
- info_data = g_string_new ("");
-
- /* join_data contains the optionals joins to do to retrieve new data on other
- * tables.
- */
- join_data = g_string_new ("");
-
- /* fill info_data and join data with optional sql */
- sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
-
if (group_them == TRUE)
{
+ other_parameters |= DYN_GET_GLOBAL_MEMBERS_FILTERED_EXTRA_PAR_GROUP_YES;
group_by_option = "GROUP BY symbol.name";
}
else
{
+ other_parameters |= DYN_GET_GLOBAL_MEMBERS_FILTERED_EXTRA_PAR_GROUP_NO;
group_by_option = "";
}
if (results_limit > 0)
{
- limit = g_strdup_printf ("LIMIT %d", results_limit);
+ other_parameters |= DYN_GET_GLOBAL_MEMBERS_FILTERED_EXTRA_PAR_LIMIT;
limit_free = TRUE;
+ limit = g_strdup_printf ("LIMIT ## /* name:'limit' type:gint */");
}
if (results_offset > 0)
{
- offset = g_strdup_printf ("OFFSET %d", results_offset);
+ other_parameters |= DYN_GET_GLOBAL_MEMBERS_FILTERED_EXTRA_PAR_OFFSET;
+ offset = g_strdup_printf ("OFFSET ## /* name:'offset' type:gint */");
offset_free = TRUE;
}
if (filter_kinds == NULL)
{
- query_str = g_strdup_printf ("SELECT symbol.symbol_id AS symbol_id, "
- "symbol.name AS name, symbol.file_position AS file_position, "
- "symbol.is_file_scope AS is_file_scope, "
- "symbol.signature AS signature, sym_kind.kind_name AS kind_name %s FROM symbol "
- "JOIN sym_kind ON symbol.kind_id = sym_kind.sym_kind_id %s "
- "WHERE symbol.scope_id <= 0 AND symbol.is_file_scope = 0 "
- "%s %s %s", info_data->str, join_data->str,
- group_by_option, limit, offset);
+ if ((dyn_node = sdb_engine_get_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_CLASS_PARENTS, sym_info,
+ other_parameters)) == NULL)
+ {
+ /* info_data contains the stuff after SELECT and befor FROM */
+ info_data = g_string_new ("");
+
+ /* join_data contains the optionals joins to do to retrieve new data on other
+ * tables.
+ */
+ join_data = g_string_new ("");
+
+ /* fill info_data and join data with optional sql */
+ sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
+
+ query_str = g_strdup_printf ("SELECT symbol.symbol_id AS symbol_id, "
+ "symbol.name AS name, symbol.file_position AS file_position, "
+ "symbol.is_file_scope AS is_file_scope, "
+ "symbol.signature AS signature, sym_kind.kind_name AS kind_name %s FROM symbol "
+ "JOIN sym_kind ON symbol.kind_id = sym_kind.sym_kind_id %s "
+ "WHERE symbol.scope_id <= 0 AND symbol.is_file_scope = 0 "
+ "%s %s %s", info_data->str, join_data->str,
+ group_by_option, limit, offset);
+
+ dyn_node = sdb_engine_insert_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_GLOBAL_MEMBERS_FILTERED,
+ sym_info, other_parameters,
+ query_str);
+
+ g_free (query_str);
+ g_string_free (join_data, TRUE);
+ g_string_free (info_data, TRUE);
+ }
}
else
{
filter_str = g_string_new ("");
/* build filter string */
- if (filter_kinds->len > 0)
+ gint i;
+ if (include_kinds == TRUE)
{
- gint i;
- if (include_kinds == TRUE)
- {
- filter_str = g_string_append (filter_str , "AND sym_kind.kind_name IN ('");
- }
- else
- {
- filter_str = g_string_append (filter_str , "AND sym_kind.kind_name NOT IN ('");
- }
-
+ other_parameters |=
+ DYN_GET_GLOBAL_MEMBERS_FILTERED_EXTRA_PAR_INCLUDE_KINDS_YES;
filter_str = g_string_append (filter_str ,
- g_ptr_array_index (filter_kinds, 0));
- filter_str = g_string_append (filter_str , "'");
-
- for (i = 1; i < filter_kinds->len; i++)
- {
- filter_str = g_string_append (filter_str , ", '");
- filter_str = g_string_append (filter_str ,
- g_ptr_array_index (filter_kinds, i));
- filter_str = g_string_append (filter_str , "'");
+ "AND sym_kind.kind_name IN (## /* name:'filter0' type:gchararray */");
+ }
+ else
+ {
+ other_parameters |=
+ DYN_GET_GLOBAL_MEMBERS_FILTERED_EXTRA_PAR_INCLUDE_KINDS_NO;
+ filter_str = g_string_append (filter_str ,
+ "AND sym_kind.kind_name NOT IN (## /* name:'filter0' type:gchararray */");
+ }
+
+ if ((dyn_node = sdb_engine_get_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_CLASS_PARENTS, sym_info,
+ other_parameters)) == NULL)
+ {
+ /* info_data contains the stuff after SELECT and befor FROM */
+ info_data = g_string_new ("");
+
+ /* join_data contains the optionals joins to do to retrieve new data on other
+ * tables.
+ */
+ join_data = g_string_new ("");
+
+ /* fill info_data and join data with optional sql */
+ sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
+
+ for (i = 1; i < 5; i++)
+ {
+ g_string_append_printf (filter_str ,
+ ",## /* name:'filter%d' type:gchararray */", i);
}
filter_str = g_string_append (filter_str , ")");
- }
-
- query_str = g_strdup_printf ("SELECT symbol.symbol_id AS symbol_id, "
- "symbol.name AS name, symbol.file_position AS file_position, "
- "symbol.is_file_scope AS is_file_scope, symbol.signature AS signature, "
- "sym_kind.kind_name AS kind_name %s FROM symbol "
- "%s JOIN sym_kind ON symbol.kind_id = sym_kind.sym_kind_id "
- "WHERE symbol.scope_id <= 0 AND symbol.is_file_scope = 0 "
- "%s %s %s %s", info_data->str, join_data->str,
- filter_str->str, group_by_option, limit, offset);
- g_string_free (filter_str, FALSE);
+ query_str = g_strdup_printf ("SELECT symbol.symbol_id AS symbol_id, "
+ "symbol.name AS name, symbol.file_position AS file_position, "
+ "symbol.is_file_scope AS is_file_scope, symbol.signature AS signature, "
+ "sym_kind.kind_name AS kind_name %s FROM symbol "
+ "%s JOIN sym_kind ON symbol.kind_id = sym_kind.sym_kind_id "
+ "WHERE symbol.scope_id <= 0 AND symbol.is_file_scope = 0 "
+ "%s %s %s %s", info_data->str, join_data->str,
+ filter_str->str, group_by_option, limit, offset);
+
+ dyn_node = sdb_engine_insert_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_GLOBAL_MEMBERS_FILTERED,
+ sym_info, other_parameters,
+ query_str);
+
+ g_free (query_str);
+ g_string_free (join_data, TRUE);
+ g_string_free (info_data, TRUE);
+ }
+ g_string_free (filter_str, TRUE);
}
- DEBUG_PRINT ("symbol_db_engine_get_global_members_filtered query is %s", query_str);
if (limit_free)
g_free (limit);
@@ -5621,23 +6126,96 @@
if (offset_free)
g_free (offset);
- if ( (data = sdb_engine_execute_select_sql (dbe, query_str)) == NULL ||
- gda_data_model_get_n_rows (data) <= 0 )
+ if (dyn_node == NULL)
{
- g_free (query_str);
- g_string_free (info_data, FALSE);
- g_string_free (join_data, FALSE);
if (priv->mutex)
g_mutex_unlock (priv->mutex);
return NULL;
}
+
+ if (other_parameters & DYN_GET_GLOBAL_MEMBERS_FILTERED_EXTRA_PAR_LIMIT)
+ {
+ GValue *value;
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "limit")) == NULL)
+ {
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
+ value = gda_value_new (G_TYPE_INT);
+ g_value_set_int (value, results_limit);
+ gda_holder_set_value (param, value);
+ gda_value_free (value);
+ }
+
+ if (other_parameters & DYN_GET_GLOBAL_MEMBERS_FILTERED_EXTRA_PAR_OFFSET)
+ {
+ GValue *value;
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "offset")) == NULL)
+ {
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
-/* gda_data_model_dump (data, stdout);*/
+ value = gda_value_new (G_TYPE_INT);
+ g_value_set_int (value, results_offset);
+ gda_holder_set_value (param, value);
+ gda_value_free (value);
+ }
- g_free (query_str);
- g_string_free (info_data, FALSE);
- g_string_free (join_data, FALSE);
+ if (other_parameters & DYN_GET_GLOBAL_MEMBERS_FILTERED_EXTRA_PAR_INCLUDE_KINDS_YES ||
+ other_parameters & DYN_GET_GLOBAL_MEMBERS_FILTERED_EXTRA_PAR_INCLUDE_KINDS_NO)
+ {
+ /* bad hardcode but it saves strings alloc/dealloc. */
+ param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "filter0");
+ if (filter_kinds->len > 0)
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 0));
+
+ param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "filter1");
+ if (filter_kinds->len > 1)
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 1));
+ else
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 0));
+
+ param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "filter2");
+ if (filter_kinds->len > 2)
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 2));
+ else
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 0));
+
+ param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "filter3");
+ if (filter_kinds->len > 3)
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 3));
+ else
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 0));
+
+ param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "filter4");
+ if (filter_kinds->len > 4)
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 4));
+ else
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 0));
+ }
+
+
+ /* execute the query with parametes just set */
+ data = gda_connection_statement_execute_select (priv->db_connection,
+ (GdaStatement*)dyn_node->stmt,
+ (GdaSet*)dyn_node->plist, NULL);
+
+ if (!GDA_IS_DATA_MODEL (data) ||
+ gda_data_model_get_n_rows (GDA_DATA_MODEL (data)) <= 0)
+ {
+ if (data != NULL)
+ g_object_unref (data);
+
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
if (priv->mutex)
g_mutex_unlock (priv->mutex);
return (SymbolDBEngineIterator *)symbol_db_engine_iterator_new (data,
@@ -5649,14 +6227,18 @@
* A filtered version of the symbol_db_engine_get_scope_members_by_symbol_id ().
* You can specify which kind of symbols to retrieve, and if include them or exclude.
* Kinds are 'namespace', 'class' etc.
- * FIXME: probably can be merged to symbol_db_engine_get_scope_members_by_symbol_id().
- * Wait for a stable libgda first.
+ * @param filter_kinds cannot be NULL.
*/
+#define DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_FILTERED_EXTRA_PAR_LIMIT 1
+#define DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_FILTERED_EXTRA_PAR_OFFSET 2
+#define DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_FILTERED_EXTRA_PAR_INCLUDE_KINDS_YES 4
+#define DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_FILTERED_EXTRA_PAR_INCLUDE_KINDS_NO 8
+
SymbolDBEngineIterator *
symbol_db_engine_get_scope_members_by_symbol_id_filtered (SymbolDBEngine *dbe,
gint scope_parent_symbol_id,
const GPtrArray *filter_kinds,
- gboolean include_kinds,
+ gboolean include_kinds,
gint results_limit,
gint results_offset,
SymExtraInfo sym_info)
@@ -5671,6 +6253,9 @@
gboolean limit_free = FALSE;
gchar *offset = "";
gboolean offset_free = FALSE;
+ gint other_parameters;
+ const DynChildQueryNode *dyn_node = NULL;
+ GdaHolder *param;
g_return_val_if_fail (dbe != NULL, NULL);
priv = dbe->priv;
@@ -5686,78 +6271,98 @@
g_mutex_unlock (priv->mutex);
return NULL;
}
-
- /* info_data contains the stuff after SELECT and befor FROM */
- info_data = g_string_new ("");
- /* join_data contains the optionals joins to do to retrieve new data on other
- * tables.
- */
- join_data = g_string_new ("");
-
+ /* syminfo kind is already included in results */
sym_info = sym_info & ~SYMINFO_KIND;
-
- /* fill info_data and join data with optional sql */
- sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
+
+ /* init parameters */
+ other_parameters = 0;
if (results_limit > 0)
{
- limit = g_strdup_printf ("LIMIT %d", results_limit);
+ limit = g_strdup_printf ("LIMIT ## /* name:'limit' type:gint */");
limit_free = TRUE;
+ other_parameters |=
+ DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_FILTERED_EXTRA_PAR_LIMIT;
}
if (results_offset > 0)
{
- offset = g_strdup_printf ("OFFSET %d", results_offset);
+ offset = g_strdup_printf ("OFFSET ## /* name:'offset' type:gint */");
offset_free = TRUE;
+ other_parameters |=
+ DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_FILTERED_EXTRA_PAR_OFFSET;
}
filter_str = g_string_new ("");
/* build filter string */
- if (filter_kinds->len > 0)
+ gint i;
+ if (include_kinds == TRUE)
{
- gint i;
- if (include_kinds == TRUE)
- {
- filter_str = g_string_append (filter_str , "AND sym_kind.kind_name IN ('");
- }
- else
- {
- filter_str = g_string_append (filter_str , "AND sym_kind.kind_name NOT IN ('");
- }
-
+ other_parameters |=
+ DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_FILTERED_EXTRA_PAR_INCLUDE_KINDS_YES;
+ filter_str = g_string_append (filter_str ,
+ "AND sym_kind.kind_name IN (## /* name:'filter0' type:gchararray */");
+ }
+ else
+ {
+ other_parameters |=
+ DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_FILTERED_EXTRA_PAR_INCLUDE_KINDS_NO;
filter_str = g_string_append (filter_str ,
- g_ptr_array_index (filter_kinds, 0));
- filter_str = g_string_append (filter_str , "'");
+ "AND sym_kind.kind_name NOT IN (## /* name:'filter0' type:gchararray */");
+ }
+
+
+ if ((dyn_node = sdb_engine_get_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_FILTERED, sym_info,
+ other_parameters)) == NULL)
+ {
+ /* info_data contains the stuff after SELECT and befor FROM */
+ info_data = g_string_new ("");
+
+ /* join_data contains the optionals joins to do to retrieve new data on other
+ * tables.
+ */
+ join_data = g_string_new ("");
+
+ /* fill info_data and join data with optional sql */
+ sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
- for (i = 1; i < filter_kinds->len; i++)
- {
- filter_str = g_string_append (filter_str , ", '");
- filter_str = g_string_append (filter_str ,
- g_ptr_array_index (filter_kinds, i));
- filter_str = g_string_append (filter_str , "'");
+ for (i = 1; i < 5; i++)
+ {
+ g_string_append_printf (filter_str ,
+ ",## /* name:'filter%d' type:gchararray */", i);
}
filter_str = g_string_append (filter_str , ")");
-
- }
- /* ok, beware that we use an 'alias hack' to accomplish compatibility with
- * sdb_engine_prepare_symbol_info_sql () function. In particular we called
- * the first joining table 'a', the second one 'symbol', where there is the info we
- * want
- */
- query_str = g_strdup_printf ("SELECT symbol.symbol_id, symbol.name, "
- "symbol.file_position, "
- "symbol.is_file_scope, symbol.signature, sym_kind.kind_name %s "
- "FROM symbol a, symbol symbol "
- "%s JOIN sym_kind ON symbol.kind_id = sym_kind.sym_kind_id "
- "WHERE a.symbol_id = '%d' AND symbol.scope_id = a.scope_definition_id "
- "AND symbol.scope_id > 0 %s %s %s", info_data->str, join_data->str,
- scope_parent_symbol_id, filter_str->str,
- limit, offset);
+ /* ok, beware that we use an 'alias hack' to accomplish compatibility with
+ * sdb_engine_prepare_symbol_info_sql () function. In particular we called
+ * the first joining table 'a', the second one 'symbol', where there is the info we
+ * want
+ */
+ query_str = g_strdup_printf ("SELECT symbol.symbol_id AS symbol_id, "
+ "symbol.name AS name, "
+ "symbol.file_position AS file_position, "
+ "symbol.is_file_scope AS is_file_scope, symbol.signature AS signature, "
+ "sym_kind.kind_name AS kind_name %s "
+ "FROM symbol a, symbol symbol "
+ "%s JOIN sym_kind ON symbol.kind_id = sym_kind.sym_kind_id "
+ "WHERE a.symbol_id = ## /* name:'scopeparentsymid' type:gint */ "
+ "AND symbol.scope_id = a.scope_definition_id "
+ "AND symbol.scope_id > 0 %s %s %s", info_data->str, join_data->str,
+ filter_str->str, limit, offset);
+
+ dyn_node = sdb_engine_insert_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_FILTERED,
+ sym_info, other_parameters,
+ query_str);
+
+ g_free (query_str);
+ g_string_free (join_data, TRUE);
+ g_string_free (info_data, TRUE);
+ }
- DEBUG_PRINT ("symbol_db_engine_get_scope_"
- "members_by_symbol_id_filtered () query is %s", query_str);
+ g_string_free (filter_str, TRUE);
if (limit_free)
g_free (limit);
@@ -5765,33 +6370,123 @@
if (offset_free)
g_free (offset);
- g_string_free (filter_str, FALSE);
- g_string_free (info_data, FALSE);
- g_string_free (join_data, FALSE);
-
- if ( (data = sdb_engine_execute_select_sql (dbe, query_str)) == NULL ||
- gda_data_model_get_n_rows (data) <= 0 )
+ if (dyn_node == NULL)
{
- g_free (query_str);
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
+ if (other_parameters & DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_FILTERED_EXTRA_PAR_LIMIT)
+ {
+ GValue *value;
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "limit")) == NULL)
+ {
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
+ value = gda_value_new (G_TYPE_INT);
+ g_value_set_int (value, results_limit);
+ gda_holder_set_value (param, value);
+ gda_value_free (value);
+ }
+
+ if (other_parameters & DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_FILTERED_EXTRA_PAR_OFFSET)
+ {
+ GValue *value;
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "offset")) == NULL)
+ {
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
+ value = gda_value_new (G_TYPE_INT);
+ g_value_set_int (value, results_offset);
+ gda_holder_set_value (param, value);
+ gda_value_free (value);
+ }
+
+ if (other_parameters &
+ DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_FILTERED_EXTRA_PAR_INCLUDE_KINDS_YES ||
+ other_parameters &
+ DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_FILTERED_EXTRA_PAR_INCLUDE_KINDS_NO)
+ {
+ /* bad hardcode but it saves strings alloc/dealloc. */
+ param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "filter0");
+ if (filter_kinds->len > 0)
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 0));
+
+ param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "filter1");
+ if (filter_kinds->len > 1)
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 1));
+ else
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 0));
+
+ param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "filter2");
+ if (filter_kinds->len > 2)
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 2));
+ else
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 0));
+
+ param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "filter3");
+ if (filter_kinds->len > 3)
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 3));
+ else
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 0));
+ param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "filter4");
+ if (filter_kinds->len > 4)
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 4));
+ else
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 0));
+ }
+
+
+ GValue *value;
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "scopeparentsymid")) == NULL)
+ {
if (priv->mutex)
g_mutex_unlock (priv->mutex);
- return NULL;
+ return NULL;
}
- g_free (query_str);
+ value = gda_value_new (G_TYPE_INT);
+ g_value_set_int (value, scope_parent_symbol_id);
+ gda_holder_set_value (param, value);
+ gda_value_free (value);
+ /* execute the query with parametes just set */
+ data = gda_connection_statement_execute_select (priv->db_connection,
+ (GdaStatement*)dyn_node->stmt,
+ (GdaSet*)dyn_node->plist, NULL);
+
+ if (!GDA_IS_DATA_MODEL (data) ||
+ gda_data_model_get_n_rows (GDA_DATA_MODEL (data)) <= 0)
+ {
+ if (data != NULL)
+ g_object_unref (data);
+
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
if (priv->mutex)
g_mutex_unlock (priv->mutex);
-
return (SymbolDBEngineIterator *)symbol_db_engine_iterator_new (data,
- priv->sym_type_conversion_hash);
+ priv->sym_type_conversion_hash);
}
/**
* Sometimes it's useful going to query just with ids [and so integers] to have
* a little speed improvement.
*/
+#define DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_EXTRA_PAR_LIMIT 1
+#define DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_EXTRA_PAR_OFFSET 2
+
SymbolDBEngineIterator *
symbol_db_engine_get_scope_members_by_symbol_id (SymbolDBEngine *dbe,
gint scope_parent_symbol_id,
@@ -5812,6 +6507,9 @@
gboolean limit_free = FALSE;
gchar *offset = "";
gboolean offset_free = FALSE;
+ gint other_parameters;
+ const DynChildQueryNode *dyn_node = NULL;
+ GdaHolder *param;
g_return_val_if_fail (dbe != NULL, NULL);
priv = dbe->priv;
@@ -5828,41 +6526,61 @@
return NULL;
}
- /* info_data contains the stuff after SELECT and befor FROM */
- info_data = g_string_new ("");
+ other_parameters = 0;
- /* join_data contains the optionals joins to do to retrieve new data on other
- * tables.
- */
- join_data = g_string_new ("");
-
- /* fill info_data and join data with optional sql */
- sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
-
if (results_limit > 0)
{
- limit = g_strdup_printf ("LIMIT %d", results_limit);
+ limit = g_strdup_printf ("LIMIT ## /* name:'limit' type:gint */");
limit_free = TRUE;
+ other_parameters |= DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_EXTRA_PAR_LIMIT;
}
if (results_offset > 0)
{
- offset = g_strdup_printf ("OFFSET %d", results_offset);
+ offset = g_strdup_printf ("OFFSET ## /* name:'offset' type:gint */");
offset_free = TRUE;
+ other_parameters |= DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_EXTRA_PAR_OFFSET;
}
- /* ok, beware that we use an 'alias hack' to accomplish compatibility with
- * sdb_engine_prepare_symbol_info_sql () function. In particular we called
- * the first joining table 'a', the second one 'symbol', where is the info we
- * want
- */
- query_str = g_strdup_printf ("SELECT symbol.symbol_id, symbol.name, "
- "symbol.file_position, "
- "symbol.is_file_scope, symbol.signature %s FROM symbol a, symbol symbol "
- "%s WHERE a.symbol_id = '%d' AND symbol.scope_id = a.scope_definition_id "
- "AND symbol.scope_id > 0 %s %s", info_data->str, join_data->str,
- scope_parent_symbol_id,
+ if ((dyn_node = sdb_engine_get_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_SCOPE_MEMBERS_BY_SYMBOL_ID, sym_info,
+ other_parameters)) == NULL)
+ {
+ /* info_data contains the stuff after SELECT and befor FROM */
+ info_data = g_string_new ("");
+
+ /* join_data contains the optionals joins to do to retrieve new data on other
+ * tables.
+ */
+ join_data = g_string_new ("");
+
+ /* fill info_data and join data with optional sql */
+ sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
+
+
+ /* ok, beware that we use an 'alias hack' to accomplish compatibility with
+ * sdb_engine_prepare_symbol_info_sql () function. In particular we called
+ * the first joining table 'a', the second one 'symbol', where is the info we
+ * want
+ */
+ query_str = g_strdup_printf ("SELECT symbol.symbol_id AS symbol_id, "
+ "symbol.name AS name, symbol.file_position AS file_position, "
+ "symbol.is_file_scope AS is_file_scope, symbol.signature AS signature "
+ "%s FROM symbol a, symbol symbol "
+ "%s WHERE a.symbol_id = ## /* name:'scopeparentsymid' type:gint */ "
+ "AND symbol.scope_id = a.scope_definition_id "
+ "AND symbol.scope_id > 0 %s %s", info_data->str, join_data->str,
limit, offset);
+
+ dyn_node = sdb_engine_insert_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_SCOPE_MEMBERS_BY_SYMBOL_ID,
+ sym_info, other_parameters,
+ query_str);
+
+ g_free (query_str);
+ g_string_free (info_data, TRUE);
+ g_string_free (join_data, TRUE);
+ }
if (limit_free)
g_free (limit);
@@ -5870,32 +6588,91 @@
if (offset_free)
g_free (offset);
- if ( (data = sdb_engine_execute_select_sql (dbe, query_str)) == NULL ||
- gda_data_model_get_n_rows (data) <= 0 )
+ if (dyn_node == NULL)
+ {
+ DEBUG_PRINT ("dyn_node is NULL");
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
+
+ if (other_parameters & DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_EXTRA_PAR_LIMIT)
+ {
+ GValue *value;
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "limit")) == NULL)
+ {
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
+ value = gda_value_new (G_TYPE_INT);
+ g_value_set_int (value, results_limit);
+ gda_holder_set_value (param, value);
+ gda_value_free (value);
+ }
+
+ if (other_parameters & DYN_GET_SCOPE_MEMBERS_BY_SYMBOL_ID_EXTRA_PAR_OFFSET)
+ {
+ GValue *value;
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "offset")) == NULL)
+ {
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
+ value = gda_value_new (G_TYPE_INT);
+ g_value_set_int (value, results_offset);
+ gda_holder_set_value (param, value);
+ gda_value_free (value);
+ }
+
+ GValue *value;
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "scopeparentsymid")) == NULL)
{
- g_free (query_str);
if (priv->mutex)
g_mutex_unlock (priv->mutex);
- return NULL;
+ return NULL;
}
- g_free (query_str);
- g_string_free (info_data, FALSE);
- g_string_free (join_data, FALSE);
+ value = gda_value_new (G_TYPE_INT);
+ g_value_set_int (value, scope_parent_symbol_id);
+ gda_holder_set_value (param, value);
+ gda_value_free (value);
+ /* execute the query with parametes just set */
+ data = gda_connection_statement_execute_select (priv->db_connection,
+ (GdaStatement*)dyn_node->stmt,
+ (GdaSet*)dyn_node->plist, NULL);
+
+ if (!GDA_IS_DATA_MODEL (data) ||
+ gda_data_model_get_n_rows (GDA_DATA_MODEL (data)) <= 0)
+ {
+ if (data != NULL)
+ g_object_unref (data);
+
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
if (priv->mutex)
g_mutex_unlock (priv->mutex);
return (SymbolDBEngineIterator *)symbol_db_engine_iterator_new (data,
priv->sym_type_conversion_hash);
}
-/** scope_path cannot be NULL.
+/**
+ * scope_path cannot be NULL.
* scope_path will be something like "scope1_kind", "scope1_name", "scope2_kind",
* "scope2_name", NULL
*/
SymbolDBEngineIterator *
symbol_db_engine_get_scope_members (SymbolDBEngine *dbe,
- const GPtrArray* scope_path, SymExtraInfo sym_info)
+ const GPtrArray* scope_path,
+ SymExtraInfo sym_info)
{
/*
simple scope
@@ -5923,6 +6700,9 @@
gint final_definition_id;
GString *info_data;
GString *join_data;
+ GdaHolder *param;
+ GValue *value;
+ const DynChildQueryNode *dyn_node;
g_return_val_if_fail (dbe != NULL, NULL);
priv = dbe->priv;
@@ -5941,37 +6721,75 @@
return NULL;
}
- /* info_data contains the stuff after SELECT and befor FROM */
- info_data = g_string_new ("");
+ if ((dyn_node = sdb_engine_get_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_SCOPE_MEMBERS, sym_info, 0)) == NULL)
+ {
+ /* info_data contains the stuff after SELECT and befor FROM */
+ info_data = g_string_new ("");
- /* join_data contains the optionals joins to do to retrieve new data on other
- * tables.
- */
- join_data = g_string_new ("");
+ /* join_data contains the optionals joins to do to retrieve new data on other
+ * tables.
+ */
+ join_data = g_string_new ("");
+
+ /* fill info_data and join data with optional sql */
+ sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
+
+ query_str = g_strdup_printf ("SELECT symbol.symbol_id AS symbol_id, "
+ "symbol.name AS name, symbol.file_position AS file_position, "
+ "symbol.is_file_scope AS is_file_scope, symbol.signature AS signature "
+ "%s FROM symbol "
+ "%s WHERE scope_id = ## /* name:'defid' type:gint */",
+ info_data->str, join_data->str);
+
+ dyn_node = sdb_engine_insert_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_SCOPE_MEMBERS,
+ sym_info, 0,
+ query_str);
+
+ g_free (query_str);
+ g_string_free (info_data, TRUE);
+ g_string_free (join_data, TRUE);
+ }
- /* fill info_data and join data with optional sql */
- sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
+ if (dyn_node == NULL)
+ {
+ DEBUG_PRINT ("dyn_node is NULL");
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
- query_str = g_strdup_printf ("SELECT symbol.symbol_id, symbol.name, "
- "symbol.file_position, "
- "symbol.is_file_scope, symbol.signature %s FROM symbol "
- "%s WHERE scope_id = '%d'", info_data->str, join_data->str,
- final_definition_id);
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "defid")) == NULL)
+ {
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
+ value = gda_value_new (G_TYPE_INT);
+ g_value_set_int (value, final_definition_id);
+
+ gda_holder_set_value (param, value);
+ gda_value_free (value);
-/* DEBUG_PRINT ("DYNAMIC query is %s", query_str);*/
- if ( (data = sdb_engine_execute_select_sql (dbe, query_str)) == NULL ||
- gda_data_model_get_n_rows (data) <= 0 )
+ /* execute the query with parametes just set */
+ data = gda_connection_statement_execute_select (priv->db_connection,
+ (GdaStatement*)dyn_node->stmt,
+ (GdaSet*)dyn_node->plist, NULL);
+
+ if (!GDA_IS_DATA_MODEL (data) ||
+ gda_data_model_get_n_rows (data) <= 0)
{
- g_free (query_str);
+ if (data != NULL)
+ g_object_unref (data);
+
if (priv->mutex)
g_mutex_unlock (priv->mutex);
- return NULL;
+ return NULL;
}
- g_free (query_str);
- g_string_free (info_data, FALSE);
- g_string_free (join_data, FALSE);
if (priv->mutex)
g_mutex_unlock (priv->mutex);
@@ -5979,53 +6797,113 @@
priv->sym_type_conversion_hash);
}
-/* Returns an iterator to the data retrieved from database.
+/**
+ * Returns an iterator to the data retrieved from database.
* It will be possible to get the scope specified by the line of the file.
*/
SymbolDBEngineIterator *
symbol_db_engine_get_current_scope (SymbolDBEngine *dbe, const gchar* filename,
- gulong line)
+ gulong line, SymExtraInfo sym_info)
{
SymbolDBEnginePriv *priv;
- gchar *file_escaped;
gchar *query_str;
GdaDataModel *data;
+ GString *info_data;
+ GString *join_data;
+ GdaHolder *param;
+ GValue *value;
+ const DynChildQueryNode *dyn_node;
g_return_val_if_fail (dbe != NULL, NULL);
priv = dbe->priv;
if (priv->mutex)
{
- g_mutex_lock (priv->mutex);
+ g_mutex_lock (priv->mutex);
}
- file_escaped = g_strescape (filename, NULL);
- /* WARNING: probably there can be some problems with escaping file names here.
- * They should come already escaped as from project db.
- */
- query_str = g_strdup_printf ("SELECT symbol.symbol_id, symbol.name, "
- "symbol.file_position, "
- "symbol.is_file_scope, symbol.signature, MIN('%d' - symbol.file_position) "
- "FROM symbol "
- "JOIN file ON file_defined_id = file_id "
- "WHERE file.file_path = \"%s\" "
- "AND '%d' - symbol.file_position >= 0", (gint)line, file_escaped,
- (gint)line);
-
- DEBUG_PRINT ("current_scope query is %s", query_str);
-
- if ( (data = sdb_engine_execute_select_sql (dbe, query_str)) == NULL ||
- gda_data_model_get_n_rows (data) <= 0 )
+ if ((dyn_node = sdb_engine_get_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_CURRENT_SCOPE, sym_info, 0)) == NULL)
{
+ /* info_data contains the stuff after SELECT and befor FROM */
+ info_data = g_string_new ("");
+
+ /* join_data contains the optionals joins to do to retrieve new data on other
+ * tables.
+ */
+ join_data = g_string_new ("");
+
+ /* fill info_data and join data with optional sql */
+ sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
+
+ /* WARNING: probably there can be some problems with escaping file names here.
+ * They should come already escaped as from project db.
+ */
+ query_str = g_strdup_printf ("SELECT symbol.symbol_id AS symbol_id, "
+ "symbol.name AS name, symbol.file_position AS file_position, "
+ "symbol.is_file_scope AS is_file_scope, symbol.signature AS signature, "
+ "MIN(## /* name:'linenum' type:gint */ - symbol.file_position) "
+ "FROM symbol "
+ "JOIN file ON file_defined_id = file_id "
+ "WHERE file.file_path = ## /* name:'filepath' type:gchararray */ "
+ "AND ## /* name:'linenum' type:gint */ - "
+ "symbol.file_position >= 0");
+
+ dyn_node = sdb_engine_insert_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_CURRENT_SCOPE,
+ sym_info, 0,
+ query_str);
+
+ g_string_free (info_data, TRUE);
+ g_string_free (join_data, TRUE);
g_free (query_str);
- g_free (file_escaped);
+ }
+
+ if (dyn_node == NULL)
+ {
+ DEBUG_PRINT ("dyn_node is NULL");
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "linenum")) == NULL)
+ {
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
+ value = gda_value_new (G_TYPE_INT);
+ g_value_set_int (value, line);
+ gda_holder_set_value (param, value);
+ gda_value_free (value);
+
+
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "filepath")) == NULL)
+ {
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
+ gda_holder_set_value_str (param, NULL, filename);
+
+ /* execute the query with parametes just set */
+ data = gda_connection_statement_execute_select (priv->db_connection,
+ (GdaStatement*)dyn_node->stmt,
+ (GdaSet*)dyn_node->plist, NULL);
+
+ if (!GDA_IS_DATA_MODEL (data) ||
+ gda_data_model_get_n_rows (data) <= 0)
+ {
+ if (data != NULL)
+ g_object_unref (data);
+
if (priv->mutex)
g_mutex_unlock (priv->mutex);
- return NULL;
+ return NULL;
}
-
- g_free (query_str);
- g_free (file_escaped);
if (priv->mutex)
g_mutex_unlock (priv->mutex);
@@ -6046,6 +6924,8 @@
GdaDataModel *data;
GString *info_data;
GString *join_data;
+ GdaHolder *param;
+ const DynChildQueryNode *dyn_node;
g_return_val_if_fail (dbe != NULL, NULL);
g_return_val_if_fail (file_path != NULL, NULL);
@@ -6061,42 +6941,83 @@
*/
sym_info = sym_info & ~SYMINFO_FILE_PATH;
- /* info_data contains the stuff after SELECT and befor FROM */
- info_data = g_string_new ("");
- /* join_data contains the optionals joins to do to retrieve new data on other
- * tables.
- */
- join_data = g_string_new ("");
+ if ((dyn_node = sdb_engine_get_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_FILE_SYMBOLS, sym_info, 0)) == NULL)
+ {
+ /* info_data contains the stuff after SELECT and befor FROM */
+ info_data = g_string_new ("");
- /* fill info_data and join data with optional sql */
- sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
+ /* join_data contains the optionals joins to do to retrieve new data on other
+ * tables.
+ */
+ join_data = g_string_new ("");
+
+ /* fill info_data and join data with optional sql */
+ sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
+
+ /* rember to do a file_path + strlen(priv->db_directory): a project relative
+ * file path
+ */
+ query_str = g_strdup_printf ("SELECT symbol.symbol_id AS symbol_id, "
+ "symbol.name AS name, symbol.file_position AS file_position, "
+ "symbol.is_file_scope AS is_file_scope, symbol.signature AS signature "
+ "%s FROM symbol "
+ "JOIN file ON symbol.file_defined_id = file.file_id "
+ "%s WHERE file.file_path = ## /* name:'filepath' type:gchararray */",
+ info_data->str, join_data->str);
+
+ dyn_node = sdb_engine_insert_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_FILE_SYMBOLS,
+ sym_info, 0,
+ query_str);
+
+ g_free (query_str);
+ g_string_free (info_data, TRUE);
+ g_string_free (join_data, TRUE);
+ }
- /* rember to do a file_path + strlen(priv->db_directory): a project relative
- * file path
- */
- query_str = g_strdup_printf ("SELECT symbol.symbol_id, symbol.name, "
- "symbol.file_position, "
- "symbol.is_file_scope, symbol.signature %s FROM symbol "
- "JOIN file ON symbol.file_defined_id = file.file_id "
- "%s WHERE file.file_path = \"%s\"", info_data->str, join_data->str,
- file_path + strlen(priv->db_directory));
+ if (dyn_node == NULL)
+ {
+ DEBUG_PRINT ("dyn_node is NULL");
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
- DEBUG_PRINT ("symbol_db_engine_get_file_symbols (): query is %s", query_str);
-
- if ( (data = sdb_engine_execute_select_sql (dbe, query_str)) == NULL ||
- gda_data_model_get_n_rows (data) <= 0 )
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "filepath")) == NULL)
{
- g_free (query_str);
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
+ if (strlen (file_path) < strlen(priv->db_directory))
+ {
+ DEBUG_PRINT ("strlen (file_path) < strlen(priv->db_directory)");
if (priv->mutex)
g_mutex_unlock (priv->mutex);
- return NULL;
+ return NULL;
}
- g_free (query_str);
- g_string_free (info_data, FALSE);
- g_string_free (join_data, FALSE);
-
+ gda_holder_set_value_str (param, NULL, file_path + strlen(priv->db_directory));
+
+ /* execute the query with parametes just set */
+ data = gda_connection_statement_execute_select (priv->db_connection,
+ (GdaStatement*)dyn_node->stmt,
+ (GdaSet*)dyn_node->plist, NULL);
+
+ if (!GDA_IS_DATA_MODEL (data) ||
+ gda_data_model_get_n_rows (data) <= 0)
+ {
+ if (data != NULL)
+ g_object_unref (data);
+
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
if (priv->mutex)
g_mutex_unlock (priv->mutex);
return (SymbolDBEngineIterator *)symbol_db_engine_iterator_new (data,
@@ -6113,6 +7034,9 @@
GdaDataModel *data;
GString *info_data;
GString *join_data;
+ GdaHolder *param;
+ GValue *value;
+ const DynChildQueryNode *dyn_node;
g_return_val_if_fail (dbe != NULL, NULL);
priv = dbe->priv;
@@ -6122,81 +7046,71 @@
g_mutex_lock (priv->mutex);
}
- /* info_data contains the stuff after SELECT and befor FROM */
- info_data = g_string_new ("");
+ if ((dyn_node = sdb_engine_get_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_SYMBOL_INFO_BY_ID, sym_info, 0)) == NULL)
+ {
+ /* info_data contains the stuff after SELECT and befor FROM */
+ info_data = g_string_new ("");
- /* join_data contains the optionals joins to do to retrieve new data on other
- * tables.
- */
- join_data = g_string_new ("");
+ /* join_data contains the optionals joins to do to retrieve new data on other
+ * tables.
+ */
+ join_data = g_string_new ("");
- /* fill info_data and join data with optional sql */
- sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
+ /* fill info_data and join data with optional sql */
+ sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
- query_str = g_strdup_printf ("SELECT symbol.symbol_id, symbol.name, "
- "symbol.file_position, "
- "symbol.is_file_scope, symbol.signature %s FROM symbol "
- "%s WHERE symbol.symbol_id = %d", info_data->str, join_data->str,
- sym_id);
+ query_str = g_strdup_printf ("SELECT symbol.symbol_id AS symbol_id, "
+ "symbol.name AS name, symbol.file_position AS file_position, "
+ "symbol.is_file_scope AS is_file_scope, symbol.signature AS signature "
+ "%s FROM symbol "
+ "%s WHERE symbol.symbol_id = ## /* name:'symid' type:gint */",
+ info_data->str, join_data->str);
+
+ dyn_node = sdb_engine_insert_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_SYMBOL_INFO_BY_ID,
+ sym_info, 0,
+ query_str);
+
+ g_free (query_str);
+ g_string_free (info_data, TRUE);
+ g_string_free (join_data, TRUE);
+ }
-/* DEBUG_PRINT ("DYNAMIC query is %s", query_str);*/
-
- if ( (data = sdb_engine_execute_select_sql (dbe, query_str)) == NULL ||
- gda_data_model_get_n_rows (data) <= 0 )
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "symid")) == NULL)
{
- g_free (query_str);
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
+ value = gda_value_new (G_TYPE_INT);
+ g_value_set_int (value, sym_id);
+ gda_holder_set_value (param, value);
+ gda_value_free (value);
+
+ /* execute the query with parametes just set */
+ data = gda_connection_statement_execute_select (priv->db_connection,
+ (GdaStatement*)dyn_node->stmt,
+ (GdaSet*)dyn_node->plist, NULL);
+
+ if (!GDA_IS_DATA_MODEL (data) ||
+ gda_data_model_get_n_rows (data) <= 0)
+ {
+ if (data != NULL)
+ g_object_unref (data);
+
if (priv->mutex)
g_mutex_unlock (priv->mutex);
- return NULL;
+ return NULL;
}
-
- g_free (query_str);
- g_string_free (info_data, FALSE);
- g_string_free (join_data, FALSE);
-
+
if (priv->mutex)
g_mutex_unlock (priv->mutex);
return (SymbolDBEngineIterator *)symbol_db_engine_iterator_new (data,
priv->sym_type_conversion_hash);
}
-/* user must free the returned value */
-gchar*
-symbol_db_engine_get_full_local_path (SymbolDBEngine *dbe, const gchar* file)
-{
- SymbolDBEnginePriv *priv;
- gchar *full_path;
-
- g_return_val_if_fail (dbe != NULL, NULL);
-
- priv = dbe->priv;
- full_path = g_strdup_printf ("%s%s", priv->db_directory, file);
- return full_path;
-}
-
-gchar*
-symbol_db_engine_get_file_db_path (SymbolDBEngine *dbe, const gchar* full_local_file_path)
-{
- SymbolDBEnginePriv *priv;
- gchar *relative_path;
- const gchar *tmp;
- g_return_val_if_fail (dbe != NULL, NULL);
-
- priv = dbe->priv;
-
- if (priv->db_directory == NULL)
- return NULL;
-
- if (strlen (priv->db_directory) >= strlen (full_local_file_path))
- {
- return NULL;
- }
-
- tmp = full_local_file_path + strlen (priv->db_directory);
- relative_path = strdup (tmp);
-
- return relative_path;
-}
/**
@@ -6206,13 +7120,15 @@
*/
SymbolDBEngineIterator *
symbol_db_engine_find_symbol_by_name_pattern (SymbolDBEngine *dbe,
- const gchar *name, SymExtraInfo sym_info)
+ const gchar *pattern, SymExtraInfo sym_info)
{
SymbolDBEnginePriv *priv;
gchar *query_str;
GdaDataModel *data;
GString *info_data;
GString *join_data;
+ GdaHolder *param;
+ const DynChildQueryNode *dyn_node;
g_return_val_if_fail (dbe != NULL, NULL);
priv = dbe->priv;
@@ -6222,38 +7138,70 @@
g_mutex_lock (priv->mutex);
}
- /* info_data contains the stuff after SELECT and befor FROM */
- info_data = g_string_new ("");
+ if ((dyn_node = sdb_engine_get_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_FIND_SYMBOL_NAME_BY_PATTERN, sym_info, 0)) == NULL)
+ {
+ /* info_data contains the stuff after SELECT and befor FROM */
+ info_data = g_string_new ("");
- /* join_data contains the optionals joins to do to retrieve new data on other
- * tables.
- */
- join_data = g_string_new ("");
+ /* join_data contains the optionals joins to do to retrieve new data on other
+ * tables.
+ */
+ join_data = g_string_new ("");
- /* fill info_data and join data with optional sql */
- sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
+ /* fill info_data and join data with optional sql */
+ sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
- query_str = g_strdup_printf ("SELECT symbol.symbol_id, symbol.name, "
- "symbol.file_position, "
- "symbol.is_file_scope, symbol.signature %s FROM symbol "
- "%s WHERE symbol.name LIKE \"%s%%\"", info_data->str, join_data->str,
- name);
-
-/* DEBUG_PRINT ("DYNAMIC query is %s", query_str);*/
+ query_str = g_strdup_printf ("SELECT symbol.symbol_id, symbol.name, "
+ "symbol.name AS name, symbol.file_position AS file_position, "
+ "symbol.is_file_scope AS is_file_scope, symbol.signature AS signature "
+ "%s FROM symbol "
+ "%s WHERE symbol.name LIKE ## /* name:'pattern' type:gchararray */",
+ info_data->str, join_data->str);
+
+ dyn_node = sdb_engine_insert_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_FIND_SYMBOL_NAME_BY_PATTERN,
+ sym_info, 0,
+ query_str);
+
+ g_free (query_str);
+ g_string_free (info_data, TRUE);
+ g_string_free (join_data, TRUE);
+ }
- if ((data = sdb_engine_execute_select_sql (dbe, query_str)) == NULL ||
- gda_data_model_get_n_rows (data) <= 0)
+ if (dyn_node == NULL)
{
- g_free (query_str);
+ DEBUG_PRINT ("dyn_node is NULL");
if (priv->mutex)
- g_mutex_unlock (priv->mutex);
- return NULL;
+ g_mutex_unlock (priv->mutex);
+ return NULL;
}
- g_free (query_str);
- g_string_free (info_data, FALSE);
- g_string_free (join_data, FALSE);
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "pattern")) == NULL)
+ {
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+ gda_holder_set_value_str (param, NULL, pattern);
+
+ /* execute the query with parametes just set */
+ data = gda_connection_statement_execute_select (priv->db_connection,
+ (GdaStatement*)dyn_node->stmt,
+ (GdaSet*)dyn_node->plist, NULL);
+
+ if (!GDA_IS_DATA_MODEL (data) ||
+ gda_data_model_get_n_rows (data) <= 0)
+ {
+ if (data != NULL)
+ g_object_unref (data);
+
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
if (priv->mutex)
g_mutex_unlock (priv->mutex);
return (SymbolDBEngineIterator *)symbol_db_engine_iterator_new (data,
@@ -6275,11 +7223,14 @@
);
*/
SymbolDBEnginePriv *priv;
- gchar *query_str;
GdaDataModel *data;
const GValue* value;
+ GValue *value_scoped;
+ GdaHolder *param;
gint res;
gint num_rows;
+ const GdaSet *plist;
+ const GdaStatement *stmt, *stmt2;
g_return_val_if_fail (dbe != NULL, -1);
priv = dbe->priv;
@@ -6291,44 +7242,71 @@
if (db_file == NULL)
{
- query_str = g_strdup_printf ("SELECT symbol.symbol_id, symbol.file_defined_id, "
- "symbol.file_position, symbol.scope_definition_id, symbol.scope_id "
- "FROM symbol "
- "WHERE symbol.scope_definition_id = ( "
- "SELECT symbol.scope_id FROM symbol WHERE symbol.symbol_id = %d) "
- "AND symbol.scope_definition_id > 0",
- scoped_symbol_id);
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe,
+ PREP_QUERY_GET_PARENT_SCOPE_ID_BY_SYMBOL_ID_NO_FILE))
+ == NULL)
+ {
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return -1;
+ }
+
+ plist = sdb_engine_get_query_parameters_list (dbe,
+ PREP_QUERY_GET_PARENT_SCOPE_ID_BY_SYMBOL_ID_NO_FILE);
}
else
{
- query_str = g_strdup_printf ("SELECT symbol.symbol_id, symbol.file_defined_id, "
- "symbol.file_position, symbol.scope_definition_id, symbol.scope_id "
- "FROM symbol JOIN file "
- "ON symbol.file_defined_id = file.file_id "
- "WHERE symbol.scope_definition_id = ( "
- "SELECT symbol.scope_id FROM symbol WHERE symbol.symbol_id = %d) "
- "AND symbol.scope_definition_id > 0 "
- "AND file.file_path = '%s'",
- scoped_symbol_id,
- db_file);
+ if ((stmt = sdb_engine_get_statement_by_query_id (dbe,
+ PREP_QUERY_GET_PARENT_SCOPE_ID_BY_SYMBOL_ID))
+ == NULL)
+ {
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return -1;
+ }
+
+ plist = sdb_engine_get_query_parameters_list (dbe,
+ PREP_QUERY_GET_PARENT_SCOPE_ID_BY_SYMBOL_ID);
+
+ /* dbfile parameter */
+ if ((param = gda_set_get_holder ((GdaSet*)plist, "dbfile")) == NULL)
+ {
+ g_warning ("param dbfile is NULL from pquery!");
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return -1;
+ }
+ gda_holder_set_value_str (param, NULL, db_file);
}
-
- /*DEBUG_PRINT ("symbol_db_engine_get_parent_scope_id_by_symbol_id() query is %s",
- query_str);*/
- if ( (data = sdb_engine_execute_select_sql (dbe, query_str)) == NULL ||
- gda_data_model_get_n_rows (data) <= 0 )
- {
- g_free (query_str);
+ /* scoped symbol id */
+ if ((param = gda_set_get_holder ((GdaSet*)plist, "symid")) == NULL)
+ {
+ g_warning ("param symid is NULL from pquery!");
if (priv->mutex)
g_mutex_unlock (priv->mutex);
return -1;
+ }
+ value_scoped = gda_value_new (G_TYPE_INT);
+ g_value_set_int (value_scoped, scoped_symbol_id);
+ gda_holder_set_value (param, value_scoped);
+ gda_value_free (value_scoped);
+
+ /* execute the query with parametes just set */
+ data = gda_connection_statement_execute_select (priv->db_connection,
+ (GdaStatement*)stmt,
+ (GdaSet*)plist, NULL);
+
+ if (!GDA_IS_DATA_MODEL (data) ||
+ (num_rows = gda_data_model_get_n_rows (GDA_DATA_MODEL (data))) <= 0)
+ {
+ if (data != NULL)
+ g_object_unref (data);
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return -1;
}
- g_free (query_str);
-
- num_rows = gda_data_model_get_n_rows (data);
-
/* Hey, we can go in trouble here. Imagine this situation:
* We have two namespaces, 'Editor' and 'Entwickler'. Inside
* them there are two classes with the same name, 'Preferences', hence
@@ -6351,7 +7329,6 @@
if (num_rows > 1)
{
gint i;
- gchar *detailed_query;
GList *candidate_parents = NULL;
typedef struct _candidate_node {
@@ -6401,29 +7378,52 @@
node->scope_id = tmp_value1 != NULL && G_VALUE_HOLDS_INT (tmp_value1)
? g_value_get_int (tmp_value1) : -1;
}
-
-
+
candidate_parents = g_list_prepend (candidate_parents, node);
}
+
/* step 2 */
- detailed_query = g_strdup_printf ("SELECT symbol.scope_definition_id FROM symbol WHERE "
- "file_defined_id = (SELECT file_defined_id FROM symbol WHERE symbol_id = %d) "
- "AND file_position < (SELECT file_position FROM symbol WHERE symbol_id = %d) "
- "ORDER BY file_position DESC", scoped_symbol_id, scoped_symbol_id);
-
- /*DEBUG_PRINT ("detailed_query %s", detailed_query);*/
-
+ if ((stmt2 = sdb_engine_get_statement_by_query_id (dbe,
+ PREP_QUERY_GET_PARENT_SCOPE_ID_BY_SYMBOL_ID_NO_FILE)) == NULL)
+ {
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return -1;
+ }
+
+ plist = sdb_engine_get_query_parameters_list (dbe,
+ PREP_QUERY_GET_PARENT_SCOPE_ID_BY_SYMBOL_ID_NO_FILE);
+
+ /* scoped symbol id */
+ if ((param = gda_set_get_holder ((GdaSet*)plist, "scopedsymid")) == NULL)
+ {
+ g_warning ("param scopedsymid is NULL from pquery!");
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return -1;
+ }
+ value_scoped = gda_value_new (G_TYPE_INT);
+ g_value_set_int (value_scoped, scoped_symbol_id);
+ gda_holder_set_value (param, value_scoped);
+ gda_value_free (value_scoped);
+
/* we should receive just ONE row. If it's > 1 than we have surely an
* error on code.
*/
- if ( (detailed_data =
- sdb_engine_execute_select_sql (dbe, detailed_query)) == NULL ||
- gda_data_model_get_n_rows (detailed_data) < 0)
+ detailed_data = gda_connection_statement_execute_select (priv->db_connection,
+ (GdaStatement*)stmt2,
+ (GdaSet*)plist, NULL);
+
+ if (!GDA_IS_DATA_MODEL (detailed_data) ||
+ (num_rows = gda_data_model_get_n_rows (GDA_DATA_MODEL (detailed_data))) <= 0)
{
- g_free (detailed_query);
+ if (detailed_data != NULL)
+ g_object_unref (detailed_data);
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
res = -1;
- }
+ }
else /* ok we have a good result here */
{
gint j;
@@ -6432,8 +7432,6 @@
gint found_symbol_id = -1;
candidate_node *node = NULL;
- g_free (detailed_query);
-
for (j=0; j < gda_data_model_get_n_rows (detailed_data); j++)
{
const GValue *tmp_value;
@@ -6443,10 +7441,6 @@
parent_scope_definition_id = tmp_value != NULL && G_VALUE_HOLDS_INT (tmp_value)
? g_value_get_int (tmp_value) : -1;
- /*DEBUG_PRINT ("symbol_db_engine_get_parent_scope_id_by_symbol_id (): "
- "testing parent_scope_definition_id %d",
- parent_scope_definition_id);*/
-
for (k = 0; k < g_list_length (candidate_parents); k++)
{
node = g_list_nth_data (candidate_parents, k);
@@ -6463,15 +7457,6 @@
if (found)
break;
}
-#if 0
- if (found == FALSE)
- DEBUG_PRINT ("symbol_db_engine_get_parent_scope_id_by_symbol_id ():"
- "probably we didn't find the symbol we were searching for");
- else
- /* ok, right now we have node and parent_scope_id we searched for */
- DEBUG_PRINT ("symbol_db_engine_get_parent_scope_id_by_symbol_id (): "
- "FOUND parent %d!", found_symbol_id);
-#endif
res = found_symbol_id;
}
@@ -6499,13 +7484,21 @@
/**
* @param pattern Pattern you want to search for. If NULL it will use '%' and LIKE for query.
- * @param exact_match Should the pattern searched for an exact match?
+ * Please provide a pattern with '%' if you also specify a exact_match = FALSE
+ * @param exact_match Should the pattern be searched for an exact match?
* @param filter_kinds Can be NULL. In that case these filters will be taken into consideration.
* @param include_kinds Should the filter_kinds (if not null) be applied as inluded or excluded?
* @param global_search If TRUE only global public function will be searched. If false
* even private or static (for C language) will be searched.
* @param sym_info Infos about symbols you want to know.
*/
+#define DYN_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED_EXTRA_PAR_EXACT_MATCH_YES 1
+#define DYN_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED_EXTRA_PAR_EXACT_MATCH_NO 2
+#define DYN_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED_EXTRA_PAR_INCLUDE_KINDS_YES 4
+#define DYN_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED_EXTRA_PAR_INCLUDE_KINDS_NO 8
+#define DYN_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED_EXTRA_PAR_GLOBAL_SEARCH_YES 16
+#define DYN_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED_EXTRA_PAR_GLOBAL_SEARCH_NO 32
+
SymbolDBEngineIterator *
symbol_db_engine_find_symbol_by_name_pattern_filtered (SymbolDBEngine *dbe,
const gchar *pattern,
@@ -6521,7 +7514,11 @@
GString *join_data;
GString *filter_str;
gchar *query_str;
- gchar *match_str;
+ const gchar *match_str;
+ GdaHolder *param;
+ const DynChildQueryNode *dyn_node;
+ GValue *value;
+ gint other_parameters;
g_return_val_if_fail (dbe != NULL, NULL);
priv = dbe->priv;
@@ -6531,45 +7528,84 @@
g_mutex_lock (priv->mutex);
}
- /* info_data contains the stuff after SELECT and befor FROM */
- info_data = g_string_new ("");
-
- /* join_data contains the optionals joins to do to retrieve new data on other
- * tables.
- */
- join_data = g_string_new ("");
-
sym_info = sym_info & ~SYMINFO_KIND;
- /* fill info_data and join data with optional sql */
- sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
+ /* initialize dynamic stuff */
+ other_parameters = 0;
+ dyn_node = NULL;
+
/* check for a null pattern. If NULL we'll set a patter like '%'
- * and exact_match = FALSE . In this way will match everything.
+ * and exact_match = FALSE . In this way we will match everything.
*/
if (pattern == NULL)
{
pattern = "%";
exact_match = FALSE;
+ other_parameters |= DYN_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED_EXTRA_PAR_EXACT_MATCH_NO;
}
/* check for match */
if (exact_match == TRUE)
{
- match_str = g_strdup_printf (" = '%s'", pattern);
+ other_parameters |=
+ DYN_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED_EXTRA_PAR_EXACT_MATCH_YES;
+ match_str = " = ## /* name:'pattern' type:gchararray */";
+ }
+ else
+ {
+ other_parameters |=
+ DYN_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED_EXTRA_PAR_EXACT_MATCH_NO;
+ match_str = " LIKE ## /* name:'pattern' type:gchararray */";
+ }
+
+ if (global_search == TRUE)
+ {
+ other_parameters |=
+ DYN_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED_EXTRA_PAR_GLOBAL_SEARCH_YES;
}
else
{
- match_str = g_strdup_printf (" LIKE '%%%s%%'", pattern);
+ other_parameters |=
+ DYN_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED_EXTRA_PAR_GLOBAL_SEARCH_NO;
}
if (filter_kinds == NULL)
{
- query_str = g_strdup_printf ("SELECT symbol.symbol_id, "
- "symbol.name, symbol.file_position, symbol.is_file_scope, "
- "symbol.signature %s FROM symbol %s "
- "WHERE symbol.name %s AND symbol.is_file_scope = %d",
- info_data->str, join_data->str, match_str, !global_search);
+ if ((dyn_node = sdb_engine_get_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED, sym_info,
+ other_parameters)) == NULL)
+ {
+ /* info_data contains the stuff after SELECT and befor FROM */
+ info_data = g_string_new ("");
+
+ /* join_data contains the optionals joins to do to retrieve new data on other
+ * tables.
+ */
+ join_data = g_string_new ("");
+
+
+ /* fill info_data and join data with optional sql */
+ sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
+
+ query_str = g_strdup_printf ("SELECT symbol.symbol_id, symbol.name, "
+ "symbol.name AS name, symbol.file_position AS file_position, "
+ "symbol.is_file_scope AS is_file_scope, symbol.signature AS signature, "
+ "sym_kind.kind_name AS kind_name "
+ "%s FROM symbol %s JOIN sym_kind ON symbol.kind_id = sym_kind.sym_kind_id "
+ "WHERE symbol.name %s AND symbol.is_file_scope = "
+ "## /* name:'globalsearch' type:gint */",
+ info_data->str, join_data->str, match_str);
+
+ dyn_node = sdb_engine_insert_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED,
+ sym_info, other_parameters,
+ query_str);
+
+ g_free (query_str);
+ g_string_free (info_data, TRUE);
+ g_string_free (join_data, TRUE);
+ }
}
else
{
@@ -6577,70 +7613,151 @@
/* build filter string */
if (filter_kinds->len > 0)
{
- gint i;
if (include_kinds == TRUE)
{
- filter_str = g_string_append (filter_str , "AND sym_kind.kind_name IN ('");
+ other_parameters |=
+ DYN_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED_EXTRA_PAR_INCLUDE_KINDS_YES;
+
+ filter_str = g_string_append (filter_str,
+ "AND sym_kind.kind_name IN (## /* name:'filter0' type:gchararray */");
}
else
{
- filter_str = g_string_append (filter_str , "AND sym_kind.kind_name NOT IN ('");
+ other_parameters |=
+ DYN_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED_EXTRA_PAR_INCLUDE_KINDS_NO;
+
+ filter_str = g_string_append (filter_str,
+ "AND sym_kind.kind_name NOT IN (## /* name:'filter0' type:gchararray */");
}
- filter_str = g_string_append (filter_str ,
- g_ptr_array_index (filter_kinds, 0));
- filter_str = g_string_append (filter_str , "'");
+ if ((dyn_node = sdb_engine_get_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_GET_CLASS_PARENTS, sym_info,
+ other_parameters)) == NULL)
+ {
+ gint i;
+ /* info_data contains the stuff after SELECT and befor FROM */
+ info_data = g_string_new ("");
+
+ /* join_data contains the optionals joins to do to retrieve new data on other
+ * tables.
+ */
+ join_data = g_string_new ("");
- for (i = 1; i < filter_kinds->len; i++)
- {
- filter_str = g_string_append (filter_str, ", '");
- filter_str = g_string_append (filter_str,
- g_ptr_array_index (filter_kinds, i));
- filter_str = g_string_append (filter_str, "'");
+ /* fill info_data and join data with optional sql */
+ sdb_engine_prepare_symbol_info_sql (dbe, info_data, join_data, sym_info);
+
+ for (i = 1; i < 5; i++)
+ {
+ g_string_append_printf (filter_str ,
+ ",## /* name:'filter%d' type:gchararray */", i);
+ }
+ filter_str = g_string_append (filter_str , ")");
+
+ query_str = g_strdup_printf ("SELECT symbol.symbol_id, symbol.name, "
+ "symbol.name AS name, symbol.file_position AS file_position, "
+ "symbol.is_file_scope AS is_file_scope, symbol.signature AS signature, "
+ "sym_kind.kind_name AS kind_name "
+ "%s FROM symbol %s JOIN sym_kind ON symbol.kind_id = sym_kind.sym_kind_id "
+ "WHERE symbol.name %s AND symbol.is_file_scope = "
+ "## /* name:'globalsearch' type:gint */ %s GROUP BY symbol.name",
+ info_data->str, join_data->str, match_str,
+ filter_str->str);
+
+ dyn_node = sdb_engine_insert_dyn_query_node_by_id (dbe,
+ DYN_PREP_QUERY_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED,
+ sym_info, other_parameters,
+ query_str);
+
+ g_free (query_str);
+ g_string_free (info_data, TRUE);
+ g_string_free (join_data, TRUE);
}
- filter_str = g_string_append (filter_str, ")");
}
- /*
- "symbol.is_file_scope, symbol.signature, sym_kind.kind_name %s "
- "FROM symbol a, symbol symbol "
- "%s JOIN sym_kind ON symbol.kind_id = sym_kind.sym_kind_id "
- "WHERE a.symbol_id = '%d' AND symbol.scope_id = a.scope_definition_id "
-*/
- query_str = g_strdup_printf ("SELECT symbol.symbol_id, symbol.name, "
- "symbol.file_position, symbol.is_file_scope, symbol.signature, "
- "sym_kind.kind_name "
- "%s FROM symbol %s JOIN sym_kind ON symbol.kind_id = sym_kind.sym_kind_id "
- "WHERE symbol.name %s AND symbol.is_file_scope = %d %s GROUP BY symbol.name",
- info_data->str, join_data->str, match_str,
- !global_search, filter_str->str);
- g_string_free (filter_str, FALSE);
+ g_string_free (filter_str, TRUE);
+ }
+
+ if (dyn_node == NULL)
+ {
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
}
-/*
- DEBUG_PRINT ("symbol_db_engine_find_symbol_by_name_pattern_filtered query is %s",
- query_str);
-*/
- if ( (data = sdb_engine_execute_select_sql (dbe, query_str)) == NULL ||
- gda_data_model_get_n_rows (data) <= 0 )
+ if (other_parameters & DYN_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED_EXTRA_PAR_INCLUDE_KINDS_YES ||
+ other_parameters & DYN_FIND_SYMBOL_BY_NAME_PATTERN_FILTERED_EXTRA_PAR_INCLUDE_KINDS_NO)
+ {
+ /* bad hardcode but it saves strings alloc/dealloc. */
+ param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "filter0");
+ if (filter_kinds->len > 0)
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 0));
+
+ param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "filter1");
+ if (filter_kinds->len > 1)
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 1));
+ else
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 0));
+
+ param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "filter2");
+ if (filter_kinds->len > 2)
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 2));
+ else
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 0));
+
+ param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "filter3");
+ if (filter_kinds->len > 3)
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 3));
+ else
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 0));
+
+ param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "filter4");
+ if (filter_kinds->len > 4)
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 4));
+ else
+ gda_holder_set_value_str (param, NULL, g_ptr_array_index (filter_kinds, 0));
+ }
+
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "globalsearch")) == NULL)
{
- g_free (query_str);
- g_string_free (info_data, FALSE);
- g_string_free (join_data, FALSE);
if (priv->mutex)
g_mutex_unlock (priv->mutex);
return NULL;
}
- g_free (query_str);
- g_string_free (info_data, FALSE);
- g_string_free (join_data, FALSE);
+ value = gda_value_new (G_TYPE_INT);
+ g_value_set_int (value, !global_search);
+ gda_holder_set_value (param, value);
+ gda_value_free (value);
+
+
+ if ((param = gda_set_get_holder ((GdaSet*)dyn_node->plist, "pattern")) == NULL)
+ {
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
- g_free (match_str);
+ gda_holder_set_value_str (param, NULL, pattern);
+ /* execute the query with parametes just set */
+ data = gda_connection_statement_execute_select (priv->db_connection,
+ (GdaStatement*)dyn_node->stmt,
+ (GdaSet*)dyn_node->plist, NULL);
+
+ if (!GDA_IS_DATA_MODEL (data) ||
+ gda_data_model_get_n_rows (GDA_DATA_MODEL (data)) <= 0)
+ {
+ if (data != NULL)
+ g_object_unref (data);
+
+ if (priv->mutex)
+ g_mutex_unlock (priv->mutex);
+ return NULL;
+ }
+
if (priv->mutex)
g_mutex_unlock (priv->mutex);
return (SymbolDBEngineIterator *)symbol_db_engine_iterator_new (data,
- priv->sym_type_conversion_hash);
+ priv->sym_type_conversion_hash);
}
Modified: trunk/plugins/symbol-db/symbol-db-engine.h
==============================================================================
--- trunk/plugins/symbol-db/symbol-db-engine.h (original)
+++ trunk/plugins/symbol-db/symbol-db-engine.h Sat Apr 26 09:18:02 2008
@@ -250,14 +250,16 @@
* Use this function to find symbols names by patterns like '%foo_func%'
* that will return a family of my_foo_func_1, your_foo_func_2 etc
* @name must not be NULL.
+ * @name must include the optional '%' character to have a wider match, e.g. "foo_func%"
*/
SymbolDBEngineIterator *
symbol_db_engine_find_symbol_by_name_pattern (SymbolDBEngine *dbe,
- const gchar *name, SymExtraInfo sym_info);
+ const gchar *pattern, SymExtraInfo sym_info);
/**
* @param pattern Pattern you want to search for. If NULL it will use '%' and LIKE for query.
- * @param exact_match Should the pattern searched for an exact match?
+ * Please provide a pattern with '%' if you also specify a exact_match = FALSE
+ * @param exact_match Should the pattern be searched for an exact match?
* @param filter_kinds Can be NULL. In that case these filters will be taken into consideration.
* @param include_kinds Should the filter_kinds (if not null) be applied as inluded or excluded?
* @param global_search If TRUE only global public function will be searched. If false
@@ -297,7 +299,8 @@
*/
SymbolDBEngineIterator *
symbol_db_engine_get_current_scope (SymbolDBEngine *dbe,
- const gchar* filename, gulong line);
+ const gchar* filename, gulong line,
+ SymExtraInfo sym_info);
/**
@@ -312,7 +315,7 @@
* Use this function to get global symbols only. I.e. private or file-only scoped symbols
* will NOT be returned.
* @param filter_kinds Can be NULL. In that case we'll return all the kinds of symbols found
- * at root level [global level].
+ * at root level [global level]. A maximum of 5 filter_kinds are admitted.
* @param include_kinds Should we include in the result the filter_kinds or not?
* @param group_them If TRUE then will be issued a 'group by symbol.name' option.
* If FALSE you can have as result more symbols with the same name but different
@@ -343,7 +346,8 @@
*/
SymbolDBEngineIterator *
symbol_db_engine_get_scope_members (SymbolDBEngine *dbe,
- const GPtrArray* scope_path, SymExtraInfo sym_info);
+ const GPtrArray* scope_path,
+ SymExtraInfo sym_info);
/**
* Sometimes it's useful going to query just with ids [and so integers] to have
@@ -356,6 +360,12 @@
gint results_offset,
SymExtraInfo sym_info);
+/**
+ * A filtered version of the symbol_db_engine_get_scope_members_by_symbol_id ().
+ * You can specify which kind of symbols to retrieve, and if include them or exclude.
+ * Kinds are 'namespace', 'class' etc.
+ * @param filter_kinds cannot be NULL.
+ */
SymbolDBEngineIterator *
symbol_db_engine_get_scope_members_by_symbol_id_filtered (SymbolDBEngine *dbe,
gint scope_parent_symbol_id,
@@ -370,7 +380,8 @@
*/
SymbolDBEngineIterator *
symbol_db_engine_get_symbol_info_by_id (SymbolDBEngine *dbe,
- gint sym_id, SymExtraInfo sym_info);
+ gint sym_id,
+ SymExtraInfo sym_info);
G_END_DECLS
Modified: trunk/plugins/symbol-db/symbol-db-view.c
==============================================================================
--- trunk/plugins/symbol-db/symbol-db-view.c (original)
+++ trunk/plugins/symbol-db/symbol-db-view.c Sat Apr 26 09:18:02 2008
@@ -1720,7 +1720,7 @@
symbol_name, curr_symbol_id);
if (curr_tree_row_ref == NULL)
{
- continue;
+ continue;
}
/* we'll fake the gpointer to store an int */
Modified: trunk/plugins/symbol-db/tables.sql
==============================================================================
--- trunk/plugins/symbol-db/tables.sql (original)
+++ trunk/plugins/symbol-db/tables.sql Sat Apr 26 09:18:02 2008
@@ -11,7 +11,7 @@
);
CREATE TABLE file_include (file_include_id integer PRIMARY KEY AUTOINCREMENT,
- type varchar (10) not null unique
+ file_include_type varchar (10) not null unique
);
CREATE TABLE ext_include (prj_id integer REFERENCES project (project_id),
@@ -20,7 +20,7 @@
);
CREATE TABLE file_ignore (file_ignore_id integer PRIMARY KEY AUTOINCREMENT,
- type varchar (10) unique
+ file_ignore_type varchar (10) unique
);
CREATE TABLE ext_ignore (prj_id integer REFERENCES project (project_id),
@@ -55,9 +55,9 @@
);
CREATE TABLE sym_type (type_id integer PRIMARY KEY AUTOINCREMENT,
- type varchar (256) not null,
+ type_type varchar (256) not null,
type_name varchar (256) not null,
- unique (type, type_name)
+ unique (type_type, type_name)
);
CREATE TABLE sym_kind (sym_kind_id integer PRIMARY KEY AUTOINCREMENT,
@@ -108,9 +108,9 @@
CREATE INDEX file_idx_1 ON file (file_path);
-CREATE INDEX sym_type_idx_1 ON sym_type (type);
+CREATE INDEX sym_type_idx_1 ON sym_type (type_type);
-CREATE INDEX sym_type_idx_2 ON sym_type (type, type_name);
+CREATE INDEX sym_type_idx_2 ON sym_type (type_type, type_name);
CREATE TRIGGER delete_file_trg BEFORE DELETE ON file
FOR EACH ROW
Modified: trunk/plugins/symbol-db/test/Makefile.am
==============================================================================
--- trunk/plugins/symbol-db/test/Makefile.am (original)
+++ trunk/plugins/symbol-db/test/Makefile.am Sat Apr 26 09:18:02 2008
@@ -1,6 +1,7 @@
bin_PROGRAMS = \
- benchmark
+ benchmark \
+ test_symbol_db
AM_CPPFLAGS = \
-DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \
@@ -28,12 +29,7 @@
../symbol-db-engine-iterator-node.c \
../symbol-db-engine-iterator-node.h \
../symbol-db-view.h \
- ../symbol-db-view.c \
- pkg.c \
- pkg.h \
- parse.c \
- parse.h
-
+ ../symbol-db-view.c
test_symbol_db_LDFLAGS = \
$(LIBANJUTA_LIBS) \
Modified: trunk/plugins/symbol-db/test/main.c
==============================================================================
--- trunk/plugins/symbol-db/test/main.c (original)
+++ trunk/plugins/symbol-db/test/main.c Sat Apr 26 09:18:02 2008
@@ -34,7 +34,6 @@
#include "../readtags.h"
static GdaConnection *db_connection = NULL;
-static GdaClient *gda_client = NULL;
static gchar *data_source = NULL;
static gchar *dsn_name;
@@ -101,27 +100,22 @@
static void
get_parents (SymbolDBEngine *dbe)
{
-#if 0
+#if 1
gint i;
GPtrArray *scope_path;
scope_path = g_ptr_array_new();
g_ptr_array_add (scope_path, g_strdup("namespace"));
- g_ptr_array_add (scope_path, g_strdup("Third"));
- g_ptr_array_add (scope_path, g_strdup("namespace"));
- g_ptr_array_add (scope_path, g_strdup("Fourth"));
+ g_ptr_array_add (scope_path, g_strdup("PesciosNamespace"));
g_ptr_array_add (scope_path, NULL);
SymbolDBEngineIterator *iterator =
- symbol_db_engine_get_class_parents (dbe, "Fourth_2_class", scope_path);
-
- g_message ("Fourth_2_class parents:");
+ symbol_db_engine_get_class_parents (dbe, "my_class", scope_path,
+ SYMINFO_SIMPLE |
+ SYMINFO_FILE_PATH |
+ SYMINFO_KIND);
- dump_iterator (iterator);
-
- g_message ("YourClass parents:");
- iterator =
- symbol_db_engine_get_class_parents (dbe, "YourClass", NULL);
+ g_message ("my_class:");
dump_iterator (iterator);
#endif
@@ -159,7 +153,7 @@
SymbolDBEngineIterator *iterator =
symbol_db_engine_get_current_scope (dbe,
"/plugins/symbol-browser/test-class.cpp",
- 35);
+ 35, SYMINFO_SIMPLE);
if (iterator == NULL)
g_message ("iterator is NULL");
@@ -316,7 +310,7 @@
#endif
-#if 1
+#if 0
int main(int argc, char** argv)
{
SymbolDBEngine *dbe_one;
@@ -722,3 +716,38 @@
#endif
+#if 1
+int main(int argc, char** argv)
+{
+ SymbolDBEngine *dbe_one;
+ SymbolDBEngine *dbe_two;
+ tagFile *tag_file;
+ tagFileInfo tag_file_info;
+ tagEntry tag_entry;
+ gint i;
+
+ gnome_vfs_init ();
+ g_type_init();
+ gda_init ("Test db", "0.1", argc, argv);
+
+ dbe_one = symbol_db_engine_new ();
+ dbe_two = symbol_db_engine_new ();
+
+ gchar *prj_dir_one = "/home/pescio/Projects/entwickler-0.1";
+
+ g_message ("opening database ONE");
+ if (symbol_db_engine_open_db (dbe_one, prj_dir_one, prj_dir_one) == FALSE)
+ g_message ("error in opening db 1");
+
+ g_message ("opening project ONE");
+ if (symbol_db_engine_add_new_project (dbe_one, NULL, "project_one") == FALSE)
+ g_message ("error in opening project 1");
+
+ get_parents (dbe_one);
+
+ g_message ("----------SECOND QUERY-------");
+ /* test gtree lookup stuff, get it for the second time */
+ get_parents (dbe_one);
+}
+#endif
+
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]