1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3  * anjuta
4  * Copyright (C) Massimo Cora' 2007-2008 <maxcvs@email.it>
5  *
6  * anjuta is free software.
7  *
8  * You may redistribute it and/or modify it under the terms of the
9  * GNU General Public License, as published by the Free Software
10  * Foundation; either version 2 of the License, or (at your option)
11  * any later version.
12  *
13  * anjuta is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16  * See the GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with anjuta.  If not, write to:
20  * 	The Free Software Foundation, Inc.,
21  * 	51 Franklin Street, Fifth Floor
22  * 	Boston, MA  02110-1301, USA.
23  */
24 
25 #ifndef _SYMBOL_DB_ENGINE_PRIV_H_
26 #define _SYMBOL_DB_ENGINE_PRIV_H_
27 
28 #include <glib-object.h>
29 #include <glib.h>
30 #include <libanjuta/anjuta-launcher.h>
31 #include <libgda/libgda.h>
32 #include <sql-parser/gda-sql-parser.h>
33 
34 #include <libanjuta/interfaces/ianjuta-symbol-manager.h>
35 #include <libanjuta/interfaces/ianjuta-symbol.h>
36 
37 /* file should be specified without the ".db" extension. */
38 #define ANJUTA_DB_FILE	".anjuta_sym_db"
39 
40 /* if tables.sql changes or general db structure changes modify also the value here */
41 #define SYMBOL_DB_VERSION	"373.0"
42 
43 #define TABLES_SQL			PACKAGE_DATA_DIR"/tables.sql"
44 
45 #define CTAGS_MARKER	"#_#\n"
46 
47 #define SHARED_MEMORY_PREFIX			SYMBOL_DB_SHM
48 
49 #define THREADS_MAX_CONCURRENT			2
50 #define TRIGGER_SIGNALS_DELAY			100
51 
52 #define BATCH_SYMBOL_NUMBER				15000
53 
54 #define SDB_QUERY_SEARCH_HEADER \
55 	GValue v = {0}; \
56 	SymbolDBQueryPriv *priv; \
57 	g_return_val_if_fail (SYMBOL_DB_IS_QUERY (query), NULL); \
58 	priv = SYMBOL_DB_QUERY (query)->priv;
59 
60 #define SDB_GVALUE_SET_INT(value, int_value) \
61 	g_value_init (&value, G_TYPE_INT); \
62 	g_value_set_int (&value, (int_value));
63 
64 #define SDB_GVALUE_SET_DOUBLE(value, double_value) \
65 	g_value_init (&value, G_TYPE_DOUBLE); \
66 	g_value_set_double (&value, (double_value));
67 
68 #define SDB_GVALUE_SET_STRING(value, str_value) \
69 	g_value_init (&value, G_TYPE_STRING); \
70 	g_value_set_string (&value, (str_value));
71 
72 #define SDB_GVALUE_SET_STATIC_STRING(value, str_value) \
73 	g_value_init (&value, G_TYPE_STRING); \
74 	g_value_set_static_string (&value, (str_value));
75 
76 
77 #define SDB_PARAM_SET_INT(gda_param, int_value) \
78 	SDB_GVALUE_SET_INT(v, int_value); \
79 	gda_holder_set_value ((gda_param), &v, NULL); \
80 	g_value_unset (&v);
81 
82 #define SDB_PARAM_SET_DOUBLE(gda_param, double_value) \
83 	SDB_GVALUE_SET_DOUBLE(v, double_value); \
84 	gda_holder_set_value ((gda_param), &v, NULL); \
85 	g_value_unset (&v);
86 
87 #define SDB_PARAM_SET_STRING(gda_param, str_value) \
88 	SDB_GVALUE_SET_STRING(v, str_value); \
89 	gda_holder_set_value ((gda_param), &v, NULL); \
90 	g_value_unset (&v);
91 
92 #define SDB_PARAM_SET_STATIC_STRING(gda_param, str_value) \
93 	SDB_GVALUE_SET_STATIC_STRING(v, str_value); \
94 	gda_holder_set_value ((gda_param), &v, NULL); \
95 	g_value_unset (&v);
96 
97 #define SDB_PARAM_TAKE_STRING(gda_param, str_value) \
98 	g_value_init (&v, G_TYPE_STRING); \
99 	g_value_take_string (&v, (str_value)); \
100 	gda_holder_set_value ((gda_param), &v, NULL); \
101 	g_value_unset (&v);
102 
103 #define SDB_LOCK(priv) g_mutex_lock (&priv->mutex);
104 #define SDB_UNLOCK(priv) g_mutex_unlock (&priv->mutex);
105 
106 typedef enum
107 {
108 	PREP_QUERY_WORKSPACE_NEW = 0,
109 	PREP_QUERY_GET_WORKSPACE_ID_BY_UNIQUE_NAME,
110 	PREP_QUERY_PROJECT_NEW,
111 	PREP_QUERY_GET_PROJECT_ID_BY_UNIQUE_NAME,
112 	PREP_QUERY_UPDATE_PROJECT_ANALYSE_TIME,
113 	PREP_QUERY_FILE_NEW,
114 	PREP_QUERY_GET_FILE_ID_BY_UNIQUE_NAME,
115 	PREP_QUERY_GET_ALL_FROM_FILE_BY_PROJECT_NAME,
116 	PREP_QUERY_UPDATE_FILE_ANALYSE_TIME,
117 	PREP_QUERY_GET_ALL_FROM_FILE_WHERE_NOT_IN_SYMBOLS,
118 	PREP_QUERY_LANGUAGE_NEW,
119 	PREP_QUERY_GET_LANGUAGE_ID_BY_UNIQUE_NAME,
120 	PREP_QUERY_SYM_KIND_NEW,
121 	PREP_QUERY_GET_SYM_KIND_BY_UNIQUE_NAME,
122 	PREP_QUERY_SYM_ACCESS_NEW,
123 	PREP_QUERY_GET_SYM_ACCESS_BY_UNIQUE_NAME,
124 	PREP_QUERY_SYM_IMPLEMENTATION_NEW,
125 	PREP_QUERY_GET_SYM_IMPLEMENTATION_BY_UNIQUE_NAME,
126 	PREP_QUERY_HERITAGE_NEW,
127 	PREP_QUERY_SCOPE_NEW,
128 	PREP_QUERY_GET_SCOPE_ID,
129 	PREP_QUERY_SYMBOL_NEW,
130 	PREP_QUERY_GET_SYMBOL_ID_BY_CLASS_NAME,
131 	PREP_QUERY_GET_SYMBOL_ID_BY_CLASS_NAME_AND_NAMESPACE,
132 	PREP_QUERY_UPDATE_SYMBOL_SCOPE_ID,
133 	PREP_QUERY_GET_SYMBOL_ID_BY_UNIQUE_INDEX_KEY_EXT,
134 	PREP_QUERY_UPDATE_SYMBOL_ALL,
135 	PREP_QUERY_REMOVE_NON_UPDATED_SYMBOLS,
136 	PREP_QUERY_RESET_UPDATE_FLAG_SYMBOLS,
137 	PREP_QUERY_GET_REMOVED_IDS,
138 	PREP_QUERY_TMP_REMOVED_DELETE_ALL,
139 	PREP_QUERY_REMOVE_FILE_BY_PROJECT_NAME,
140 	PREP_QUERY_COUNT
141 
142 } static_query_type;
143 
144 typedef struct _static_query_node
145 {
146 	static_query_type query_id;
147 	const gchar *query_str;
148 	GdaStatement *stmt;
149 	GdaSet *plist;
150 
151 } static_query_node;
152 
153 /* normalize with iface naming */
154 typedef IAnjutaSymbolType SymType;
155 
156 typedef struct _DBESignal
157 {
158 	gpointer value;
159 	gint process_id;
160 
161 } DBESignal;
162 
163 /* the SymbolDBEngine Private structure */
164 struct _SymbolDBEnginePriv
165 {
166 	gchar *anjuta_db_file;
167 	gchar *ctags_path;
168 
169 	/* Database tools */
170 	GdaConnection *db_connection;
171 	GdaSqlParser *sql_parser;
172 	gchar *db_directory;
173 	gchar *project_directory;
174 	gchar *cnc_string;
175 
176 	/* Scanning */
177 	gint scan_process_id_sequence;
178 	gint current_scan_process_id;
179 
180 	GAsyncQueue *scan_aqueue;
181 	GAsyncQueue *updated_syms_id_aqueue;
182 	GAsyncQueue *updated_scope_syms_id_aqueue;
183 	GAsyncQueue *inserted_syms_id_aqueue;
184 	gboolean is_scanning;
185 
186 	gchar *shared_mem_str;
187 	FILE *shared_mem_file;
188 	gint shared_mem_fd;
189 	AnjutaLauncher *ctags_launcher;
190 	GList *removed_launchers;
191 	gboolean shutting_down;
192 	gboolean is_first_population;
193 	gsize symbols_scanned_count;
194 
195 	GAsyncQueue *waiting_scan_aqueue;
196 	gulong waiting_scan_handler;
197 
198 	/* Threads management */
199 	GMutex mutex;
200 	GAsyncQueue* signals_aqueue;
201 
202 	GThreadPool *thread_pool;
203 	gint timeout_trigger_handler;
204 	gint trigger_closure_retries;
205 	gint thread_closure_retries;
206 
207 	/* Miscellanea */
208 	GHashTable *sym_type_conversion_hash;
209 	GHashTable *garbage_shared_mem_files;
210 
211 	/* Caches */
212 	GHashTable *kind_cache;
213 	GHashTable *access_cache;
214 	GHashTable *implementation_cache;
215 	GHashTable *language_cache;
216 
217 	/* Table maps */
218 	GQueue *tmp_heritage_tablemap;
219 
220 	static_query_node *static_query_list[PREP_QUERY_COUNT];
221 
222 #ifdef DEBUG
223 	GTimer *first_scan_timer_DEBUG;
224 #endif
225 };
226 
227 #endif
228