1 /*
2  * Copyright (C) 2008 - 2011 Vivien Malerba <malerba@gnome-db.org>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
17  * Boston, MA  02110-1301, USA.
18  */
19 
20 #undef GDA_DISABLE_DEPRECATED
21 #include <string.h>
22 #include "gda-oracle.h"
23 #include "gda-oracle-meta.h"
24 #include "gda-oracle-provider.h"
25 #include <libgda/gda-meta-store.h>
26 #include <libgda/sql-parser/gda-sql-parser.h>
27 #include <glib/gi18n-lib.h>
28 #include <libgda/gda-server-provider-extra.h>
29 #include <libgda/gda-connection-private.h>
30 #include <libgda/gda-data-model-array.h>
31 #include <libgda/gda-set.h>
32 #include <libgda/gda-holder.h>
33 #include "gda-oracle-util.h"
34 #include <libgda/gda-debug-macros.h>
35 
36 /*
37  * predefined statements' IDs
38  */
39 typedef enum {
40         I_STMT_CATALOG,
41         I_STMT_SCHEMAS_ALL,
42 	I_STMT_SCHEMA_NAMED,
43 	I_STMT_TABLES_ALL,
44 	I_STMT_TABLES_ALL_RAW,
45 	I_STMT_TABLES,
46 	I_STMT_TABLE_NAMED,
47 	I_STMT_VIEWS_ALL,
48 	I_STMT_VIEWS,
49 	I_STMT_VIEW_NAMED,
50 	I_STMT_COLUMNS_OF_TABLE,
51         I_STMT_COLUMNS_ALL,
52 } InternalStatementItem;
53 
54 
55 /*
56  * predefined statements' SQL
57  */
58 static gchar *internal_sql[] = {
59 	/* I_STMT_CATALOG */
60 	"select ora_database_name from dual",
61 
62 	/* I_STMT_SCHEMAS_ALL */
63 	"SELECT ora_database_name, username, username, CASE WHEN username IN ('SYS', 'SYSTEM', 'DBSNMP', 'OUTLN', 'MDSYS', 'ORDSYS', 'ORDPLUGINS', 'CTXSYS', 'DSSYS', 'PERFSTAT', 'WKPROXY', 'WKSYS', 'WMSYS', 'XDB', 'ANONYMOUS', 'ODM', 'ODM_MTR', 'OLAPSYS', 'TRACESVR', 'REPADMIN') THEN 1 ELSE 0 END FROM all_users",
64 
65 	/* I_STMT_SCHEMA_NAMED */
66 	"SELECT ora_database_name, username, username, CASE WHEN username IN ('SYS', 'SYSTEM', 'DBSNMP', 'OUTLN', 'MDSYS', 'ORDSYS', 'ORDPLUGINS', 'CTXSYS', 'DSSYS', 'PERFSTAT', 'WKPROXY', 'WKSYS', 'WMSYS', 'XDB', 'ANONYMOUS', 'ODM', 'ODM_MTR', 'OLAPSYS', 'TRACESVR', 'REPADMIN') THEN 1 ELSE 0 END FROM all_users WHERE username = ##name::string",
67 
68 	/* I_STMT_TABLES_ALL */
69 	"SELECT ora_database_name, a.owner, a.table_name, 'BASE TABLE', 1, c.comments, CASE WHEN a.owner = user THEN a.table_name ELSE a.owner || '.' || a.table_name END, a.owner || '.' || a.table_name, a.owner FROM all_tables a LEFT JOIN ALL_TAB_COMMENTS c ON (a.table_name=c.table_name) UNION SELECT ora_database_name, v.owner, v.view_name, 'VIEW', 0, c.comments, CASE WHEN v.owner = user THEN v.view_name ELSE v.owner || '.' || v.view_name END, v.owner || '.' || v.view_name, v.owner FROM all_views v LEFT JOIN ALL_TAB_COMMENTS c ON (v.view_name=c.table_name)",
70 
71 	/* I_STMT_TABLES_ALL_RAW */
72 	"SELECT ora_database_name, a.owner, a.table_name FROM all_tables a UNION SELECT ora_database_name, v.owner, v.view_name FROM all_views v",
73 
74 	/* I_STMT_TABLES */
75 	"SELECT ora_database_name, a.owner, a.table_name, 'BASE TABLE', 1, c.comments, CASE WHEN a.owner = user THEN a.table_name ELSE a.owner || '.' || a.table_name END, a.owner || '.' || a.table_name, a.owner FROM all_tables a LEFT JOIN ALL_TAB_COMMENTS c ON (a.table_name=c.table_name) WHERE a.owner = ##schema::string UNION SELECT ora_database_name, v.owner, v.view_name, 'VIEW', 0, c.comments, CASE WHEN v.owner = user THEN v.view_name ELSE v.owner || '.' || v.view_name END, v.owner || '.' || v.view_name, v.owner FROM all_views v LEFT JOIN ALL_TAB_COMMENTS c ON (v.view_name=c.table_name) WHERE v.owner = ##schema::string",
76 
77 	/* I_STMT_TABLE_NAMED */
78 	"SELECT ora_database_name, a.owner, a.table_name, 'BASE TABLE', 1, c.comments, CASE WHEN a.owner = user THEN a.table_name ELSE a.owner || '.' || a.table_name END, a.owner || '.' || a.table_name, a.owner FROM all_tables a LEFT JOIN ALL_TAB_COMMENTS c ON (a.table_name=c.table_name) WHERE a.owner = ##schema::string AND a.table_name = ##name::string UNION SELECT ora_database_name, v.owner, v.view_name, 'VIEW', 0, c.comments, CASE WHEN v.owner = user THEN v.view_name ELSE v.owner || '.' || v.view_name END, v.owner || '.' || v.view_name, v.owner FROM all_views v LEFT JOIN ALL_TAB_COMMENTS c ON (v.view_name=c.table_name) WHERE v.owner = ##schema::string AND v.view_name = ##name::string",
79 
80 	/* I_STMT_VIEWS_ALL */
81 	"SELECT ora_database_name, v.owner, v.view_name, v.text, NULL, 0 FROM all_views v",
82 
83 	/* I_STMT_VIEWS */
84 	"SELECT ora_database_name, v.owner, v.view_name, v.text, NULL, 0 FROM all_views v WHERE v.owner = ##schema::string",
85 
86 	/* I_STMT_VIEW_NAMED */
87 	"SELECT ora_database_name, v.owner, v.view_name, v.text, NULL, 0 FROM all_views v WHERE v.owner = ##schema::string AND v.view_name = ##name::string",
88 
89 	/* I_STMT_COLUMNS_OF_TABLE */
90 	"SELECT ora_database_name, tc.owner, tc.table_name, tc.column_name, tc.column_id, tc.data_default, decode(tc.nullable,'N',0,'Y',1), tc.data_type, NULL, 'gchararray', CASE WHEN tc.char_used = 'C' THEN tc.char_length ELSE NULL END as clen, CASE WHEN tc.char_used = 'B' THEN tc.char_length ELSE NULL END as olen, tc.data_precision, tc.data_scale, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, c.comments  FROM ALL_TAB_COLUMNS tc LEFT JOIN ALL_COL_COMMENTS c ON (tc.owner = c.owner AND tc.table_name=c.table_name AND tc.column_name = c.column_name) WHERE tc.table_name = ##name::string ORDER BY tc.column_id",
91 
92         /* I_STMT_COLUMNS_ALL */
93 	"SELECT ora_database_name, tc.owner, tc.table_name, tc.column_name, tc.column_id, tc.data_default, decode(tc.nullable,'N',0,'Y',1), tc.data_type, NULL, 'gchararray', CASE WHEN tc.char_used = 'C' THEN tc.char_length ELSE NULL END as clen, CASE WHEN tc.char_used = 'B' THEN tc.char_length ELSE NULL END as olen, tc.data_precision, tc.data_scale, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, c.comments  FROM ALL_TAB_COLUMNS tc LEFT JOIN ALL_COL_COMMENTS c ON (tc.owner = c.owner AND tc.table_name=c.table_name AND tc.column_name = c.column_name) ORDER BY tc.table_name, tc.column_id"
94 };
95 
96 /*
97  * global static values, and
98  * predefined statements' GdaStatement, all initialized in _gda_oracle_provider_meta_init()
99  */
100 static GMutex init_mutex;
101 static GdaStatement **internal_stmt = NULL;
102 static GdaSet        *i_set = NULL;
103 static GdaSqlParser  *internal_parser = NULL;
104 
105 /*
106  * Meta initialization
107  */
108 void
_gda_oracle_provider_meta_init(GdaServerProvider * provider)109 _gda_oracle_provider_meta_init (GdaServerProvider *provider)
110 {
111 	g_mutex_lock (&init_mutex);
112 
113 	if (!internal_stmt) {
114 		InternalStatementItem i;
115 		internal_parser = gda_server_provider_internal_get_parser (provider);
116 		internal_stmt = g_new0 (GdaStatement *, sizeof (internal_sql) / sizeof (gchar*));
117 		for (i = I_STMT_CATALOG; i < sizeof (internal_sql) / sizeof (gchar*); i++) {
118 			internal_stmt[i] = gda_sql_parser_parse_string (internal_parser, internal_sql[i], NULL, NULL);
119 			if (!internal_stmt[i])
120 				g_error ("Could not parse internal statement: %s\n", internal_sql[i]);
121 		}
122 
123 		/* initialize static values here */
124 		i_set = gda_set_new_inline (4, "cat", G_TYPE_STRING, "",
125 					    "name", G_TYPE_STRING, "",
126 					    "schema", G_TYPE_STRING, "",
127 					    "name2", G_TYPE_STRING, "");
128 	}
129 
130 	g_mutex_unlock (&init_mutex);
131 }
132 
133 gboolean
_gda_oracle_meta__info(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)134 _gda_oracle_meta__info (GdaServerProvider *prov, GdaConnection *cnc,
135 		      GdaMetaStore *store, GdaMetaContext *context, GError **error)
136 {
137 	GdaDataModel *model;
138 	gboolean retval;
139 
140 	model = gda_connection_statement_execute_select (cnc, internal_stmt[I_STMT_CATALOG], NULL,
141 							 error);
142 	if (!model)
143 		return FALSE;
144 	gda_meta_store_set_identifiers_style (store, GDA_SQL_IDENTIFIERS_UPPER_CASE);
145 	retval = gda_meta_store_modify_with_context (store, context, model, error);
146 	g_object_unref (model);
147 
148 	return retval;
149 }
150 
151 gboolean
_gda_oracle_meta__btypes(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)152 _gda_oracle_meta__btypes (GdaServerProvider *prov, GdaConnection *cnc,
153 			GdaMetaStore *store, GdaMetaContext *context, GError **error)
154 {
155 	TO_IMPLEMENT;
156 	return TRUE;
157 }
158 
159 gboolean
_gda_oracle_meta__udt(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)160 _gda_oracle_meta__udt (GdaServerProvider *prov, GdaConnection *cnc,
161 		     GdaMetaStore *store, GdaMetaContext *context, GError **error)
162 {
163 	TO_IMPLEMENT;
164 	return TRUE;
165 }
166 
167 gboolean
_gda_oracle_meta_udt(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * udt_catalog,const GValue * udt_schema)168 _gda_oracle_meta_udt (GdaServerProvider *prov, GdaConnection *cnc,
169 		    GdaMetaStore *store, GdaMetaContext *context, GError **error,
170 		    const GValue *udt_catalog, const GValue *udt_schema)
171 {
172 	GdaDataModel *model = NULL;
173 	gboolean retval = TRUE;
174 
175 	/* set internal holder's values from the arguments */
176 	if (! gda_holder_set_value (gda_set_get_holder (i_set, "cat"), udt_catalog, error))
177 		return FALSE;
178 	if (! gda_holder_set_value (gda_set_get_holder (i_set, "schema"), udt_schema, error))
179 		return FALSE;
180 
181 	TO_IMPLEMENT;
182 	/* fill in @model, with something like:
183 	 * model = gda_connection_statement_execute_select (cnc, internal_stmt[I_STMT_UDT], i_set, error);
184 	 */
185 	if (!model)
186 		return FALSE;
187 	gda_meta_store_set_identifiers_style (store, GDA_SQL_IDENTIFIERS_UPPER_CASE);
188 	retval = gda_meta_store_modify_with_context (store, context, model, error);
189 	g_object_unref (model);
190 
191 	return retval;
192 }
193 
194 
195 gboolean
_gda_oracle_meta__udt_cols(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)196 _gda_oracle_meta__udt_cols (GdaServerProvider *prov, GdaConnection *cnc,
197 			  GdaMetaStore *store, GdaMetaContext *context, GError **error)
198 {
199 	TO_IMPLEMENT;
200 	return TRUE;
201 }
202 
203 gboolean
_gda_oracle_meta_udt_cols(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * udt_catalog,const GValue * udt_schema,const GValue * udt_name)204 _gda_oracle_meta_udt_cols (GdaServerProvider *prov, GdaConnection *cnc,
205 			 GdaMetaStore *store, GdaMetaContext *context, GError **error,
206 			 const GValue *udt_catalog, const GValue *udt_schema, const GValue *udt_name)
207 {
208 	TO_IMPLEMENT;
209 	return TRUE;
210 }
211 
212 gboolean
_gda_oracle_meta__enums(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)213 _gda_oracle_meta__enums (GdaServerProvider *prov, GdaConnection *cnc,
214 		       GdaMetaStore *store, GdaMetaContext *context, GError **error)
215 {
216 	TO_IMPLEMENT;
217 	return TRUE;
218 }
219 
220 gboolean
_gda_oracle_meta_enums(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * udt_catalog,const GValue * udt_schema,const GValue * udt_name)221 _gda_oracle_meta_enums (GdaServerProvider *prov, GdaConnection *cnc,
222 		      GdaMetaStore *store, GdaMetaContext *context, GError **error,
223 		      const GValue *udt_catalog, const GValue *udt_schema, const GValue *udt_name)
224 {
225 	TO_IMPLEMENT;
226 	return TRUE;
227 }
228 
229 
230 gboolean
_gda_oracle_meta__domains(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)231 _gda_oracle_meta__domains (GdaServerProvider *prov, GdaConnection *cnc,
232 			 GdaMetaStore *store, GdaMetaContext *context, GError **error)
233 {
234 	TO_IMPLEMENT;
235 	return TRUE;
236 }
237 
238 gboolean
_gda_oracle_meta_domains(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * domain_catalog,const GValue * domain_schema)239 _gda_oracle_meta_domains (GdaServerProvider *prov, GdaConnection *cnc,
240 			GdaMetaStore *store, GdaMetaContext *context, GError **error,
241 			const GValue *domain_catalog, const GValue *domain_schema)
242 {
243 	TO_IMPLEMENT;
244 	return TRUE;
245 }
246 
247 gboolean
_gda_oracle_meta__constraints_dom(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)248 _gda_oracle_meta__constraints_dom (GdaServerProvider *prov, GdaConnection *cnc,
249 				 GdaMetaStore *store, GdaMetaContext *context, GError **error)
250 {
251 	TO_IMPLEMENT;
252 	return TRUE;
253 }
254 
255 gboolean
_gda_oracle_meta_constraints_dom(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * domain_catalog,const GValue * domain_schema,const GValue * domain_name)256 _gda_oracle_meta_constraints_dom (GdaServerProvider *prov, GdaConnection *cnc,
257 				GdaMetaStore *store, GdaMetaContext *context, GError **error,
258 				const GValue *domain_catalog, const GValue *domain_schema,
259 				const GValue *domain_name)
260 {
261 	TO_IMPLEMENT;
262 	return TRUE;
263 }
264 
265 gboolean
_gda_oracle_meta__el_types(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)266 _gda_oracle_meta__el_types (GdaServerProvider *prov, GdaConnection *cnc,
267 			  GdaMetaStore *store, GdaMetaContext *context, GError **error)
268 {
269 	TO_IMPLEMENT;
270 	return TRUE;
271 }
272 
273 gboolean
_gda_oracle_meta_el_types(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * specific_name)274 _gda_oracle_meta_el_types (GdaServerProvider *prov, GdaConnection *cnc,
275 			 GdaMetaStore *store, GdaMetaContext *context, GError **error,
276 			 const GValue *specific_name)
277 {
278 	TO_IMPLEMENT;
279 	return TRUE;
280 }
281 
282 gboolean
_gda_oracle_meta__collations(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)283 _gda_oracle_meta__collations (GdaServerProvider *prov, GdaConnection *cnc,
284 			    GdaMetaStore *store, GdaMetaContext *context, GError **error)
285 {
286 	TO_IMPLEMENT;
287 	return TRUE;
288 }
289 
290 gboolean
_gda_oracle_meta_collations(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * collation_catalog,const GValue * collation_schema,const GValue * collation_name_n)291 _gda_oracle_meta_collations (GdaServerProvider *prov, GdaConnection *cnc,
292 			   GdaMetaStore *store, GdaMetaContext *context, GError **error,
293 			   const GValue *collation_catalog, const GValue *collation_schema,
294 			   const GValue *collation_name_n)
295 {
296 	TO_IMPLEMENT;
297 	return TRUE;
298 }
299 
300 gboolean
_gda_oracle_meta__character_sets(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)301 _gda_oracle_meta__character_sets (GdaServerProvider *prov, GdaConnection *cnc,
302 				GdaMetaStore *store, GdaMetaContext *context, GError **error)
303 {
304 	TO_IMPLEMENT;
305 	return TRUE;
306 }
307 
308 gboolean
_gda_oracle_meta_character_sets(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * chset_catalog,const GValue * chset_schema,const GValue * chset_name_n)309 _gda_oracle_meta_character_sets (GdaServerProvider *prov, GdaConnection *cnc,
310 			       GdaMetaStore *store, GdaMetaContext *context, GError **error,
311 			       const GValue *chset_catalog, const GValue *chset_schema,
312 			       const GValue *chset_name_n)
313 {
314 	TO_IMPLEMENT;
315 	return TRUE;
316 }
317 
318 gboolean
_gda_oracle_meta__schemata(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)319 _gda_oracle_meta__schemata (GdaServerProvider *prov, GdaConnection *cnc,
320 			  GdaMetaStore *store, GdaMetaContext *context, GError **error)
321 {
322 	GdaDataModel *model;
323 	gboolean retval;
324 	GType col_types[] = {G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_NONE};
325 
326 	model = gda_connection_statement_execute_select_full (cnc, internal_stmt[I_STMT_SCHEMAS_ALL], NULL,
327                                                               GDA_STATEMENT_MODEL_RANDOM_ACCESS, col_types, error);
328 	if (!model)
329 		return FALSE;
330 	gda_meta_store_set_identifiers_style (store, GDA_SQL_IDENTIFIERS_UPPER_CASE);
331 	retval = gda_meta_store_modify_with_context (store, context, model, error);
332 	g_object_unref (model);
333 
334 	return retval;
335 }
336 
337 gboolean
_gda_oracle_meta_schemata(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * catalog_name,const GValue * schema_name_n)338 _gda_oracle_meta_schemata (GdaServerProvider *prov, GdaConnection *cnc,
339 			 GdaMetaStore *store, GdaMetaContext *context, GError **error,
340 			 const GValue *catalog_name, const GValue *schema_name_n)
341 {
342 	GdaDataModel *model;
343         gboolean retval;
344 	GType col_types[] = {G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_NONE};
345 
346         if (! gda_holder_set_value (gda_set_get_holder (i_set, "cat"), catalog_name, error))
347                 return FALSE;
348         if (!schema_name_n) {
349 		model = gda_connection_statement_execute_select_full (cnc, internal_stmt[I_STMT_SCHEMAS_ALL], NULL,
350 								      GDA_STATEMENT_MODEL_RANDOM_ACCESS, col_types, error);
351                 if (!model)
352                         return FALSE;
353 		gda_meta_store_set_identifiers_style (store, GDA_SQL_IDENTIFIERS_UPPER_CASE);
354                 retval = gda_meta_store_modify (store, context->table_name, model, NULL, error, NULL);
355         }
356         else {
357                 if (! gda_holder_set_value (gda_set_get_holder (i_set, "name"), schema_name_n, error))
358                         return FALSE;
359 		model = gda_connection_statement_execute_select_full (cnc, internal_stmt[I_STMT_SCHEMA_NAMED], i_set,
360 								      GDA_STATEMENT_MODEL_RANDOM_ACCESS, col_types, error);
361                 if (!model)
362                         return FALSE;
363 
364 		gda_meta_store_set_identifiers_style (store, GDA_SQL_IDENTIFIERS_UPPER_CASE);
365                 retval = gda_meta_store_modify (store, context->table_name, model, "schema_name = ##name::string", error,
366                                                 "name", schema_name_n, NULL);
367         }
368         g_object_unref (model);
369 
370         return retval;
371 }
372 
373 static GType col_types_tables[] = {G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_NONE};
374 static GType col_types_views[] = {G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_NONE};
375 
376 
377 gboolean
_gda_oracle_meta__tables_views(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)378 _gda_oracle_meta__tables_views (GdaServerProvider *prov, GdaConnection *cnc,
379 				GdaMetaStore *store, GdaMetaContext *context, GError **error)
380 {
381 	GdaDataModel *tables_model, *views_model;
382         gboolean retval = TRUE;
383 
384         OracleConnectionData *cdata;
385         cdata = (OracleConnectionData*) gda_connection_internal_get_provider_data_error (cnc, error);
386         if (!cdata)
387                 return FALSE;
388 
389         tables_model = gda_connection_statement_execute_select_full (cnc, internal_stmt[I_STMT_TABLES_ALL], NULL,
390 								     GDA_STATEMENT_MODEL_RANDOM_ACCESS, col_types_tables,
391 								     error);
392         if (!tables_model)
393                 return FALSE;
394         views_model = gda_connection_statement_execute_select_full (cnc, internal_stmt[I_STMT_VIEWS_ALL], NULL,
395 								    GDA_STATEMENT_MODEL_RANDOM_ACCESS, col_types_views,
396 								    error);
397         if (!views_model) {
398                 g_object_unref (tables_model);
399                 return FALSE;
400         }
401 
402 	gda_meta_store_set_identifiers_style (store, GDA_SQL_IDENTIFIERS_UPPER_CASE);
403 
404 	GdaMetaContext c2;
405         c2 = *context; /* copy contents, just because we need to modify @context->table_name */
406         if (retval) {
407                 c2.table_name = "_tables";
408                 retval = gda_meta_store_modify_with_context (store, &c2, tables_model, error);
409         }
410         if (retval) {
411                 c2.table_name = "_views";
412                 retval = gda_meta_store_modify_with_context (store, &c2, views_model, error);
413         }
414         g_object_unref (tables_model);
415         g_object_unref (views_model);
416 
417         return retval;
418 }
419 
420 gboolean
_gda_oracle_meta_tables_views(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * table_catalog,const GValue * table_schema,const GValue * table_name_n)421 _gda_oracle_meta_tables_views (GdaServerProvider *prov, GdaConnection *cnc,
422 			     GdaMetaStore *store, GdaMetaContext *context, GError **error,
423 			     const GValue *table_catalog, const GValue *table_schema,
424 			     const GValue *table_name_n)
425 {
426 	GdaDataModel *tables_model, *views_model;
427         gboolean retval = TRUE;
428 
429         OracleConnectionData *cdata;
430         cdata = (OracleConnectionData*) gda_connection_internal_get_provider_data_error (cnc, error);
431         if (!cdata)
432                 return FALSE;
433 
434 	if (! gda_holder_set_value (gda_set_get_holder (i_set, "schema"), table_schema, error))
435                 return FALSE;
436 
437 	if (!table_name_n) {
438 		tables_model = gda_connection_statement_execute_select_full (cnc, internal_stmt[I_STMT_TABLES], i_set,
439 									     GDA_STATEMENT_MODEL_RANDOM_ACCESS, col_types_tables,
440 									     error);
441 		if (!tables_model)
442 			return FALSE;
443 		views_model = gda_connection_statement_execute_select_full (cnc, internal_stmt[I_STMT_VIEWS], i_set,
444 									    GDA_STATEMENT_MODEL_RANDOM_ACCESS, col_types_views,
445 									    error);
446 		if (!views_model) {
447 			g_object_unref (tables_model);
448 			return FALSE;
449 		}
450 	}
451 	else {
452 		if (! gda_holder_set_value (gda_set_get_holder (i_set, "name"), table_name_n, error))
453                         return FALSE;
454 		tables_model = gda_connection_statement_execute_select_full (cnc, internal_stmt[I_STMT_TABLE_NAMED], i_set,
455 									     GDA_STATEMENT_MODEL_RANDOM_ACCESS, col_types_tables,
456 									     error);
457 		if (!tables_model)
458 			return FALSE;
459 		views_model = gda_connection_statement_execute_select_full (cnc, internal_stmt[I_STMT_VIEW_NAMED], i_set,
460 									    GDA_STATEMENT_MODEL_RANDOM_ACCESS, col_types_views,
461 									    error);
462 		if (!views_model) {
463 			g_object_unref (tables_model);
464 			return FALSE;
465 		}
466 	}
467 
468 	gda_meta_store_set_identifiers_style (store, GDA_SQL_IDENTIFIERS_UPPER_CASE);
469 
470 	GdaMetaContext c2;
471         c2 = *context; /* copy contents, just because we need to modify @context->table_name */
472         if (retval) {
473                 c2.table_name = "_tables";
474                 retval = gda_meta_store_modify_with_context (store, &c2, tables_model, error);
475         }
476         if (retval) {
477                 c2.table_name = "_views";
478                 retval = gda_meta_store_modify_with_context (store, &c2, views_model, error);
479         }
480         g_object_unref (tables_model);
481         g_object_unref (views_model);
482 
483         return retval;
484 }
485 
486 /*
487  * Returns: a new G_TYPE_STRING GValue
488  */
489 static GValue *
oracle_identifier_to_value(const gchar * sqlid)490 oracle_identifier_to_value (const gchar *sqlid)
491 {
492 	GValue *v;
493 	g_return_val_if_fail (sqlid, NULL);
494 
495 	v = gda_value_new (G_TYPE_STRING);
496 	if (g_ascii_isalnum (*sqlid)) {
497 		const gchar *ptr;
498 		for (ptr = sqlid; *ptr; ptr++) {
499 			if ((*ptr == ' ') || (*ptr != g_ascii_toupper (*ptr))) {
500 				/* add quotes */
501 				g_value_take_string (v, gda_sql_identifier_force_quotes (sqlid));
502 				return v;
503 			}
504 		}
505 
506 		g_value_set_string (v, sqlid);
507 	}
508 	else
509 		g_value_take_string (v, gda_sql_identifier_force_quotes (sqlid));
510 	return v;
511 }
512 
513 gboolean
_gda_oracle_meta__columns(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)514 _gda_oracle_meta__columns (GdaServerProvider *prov, GdaConnection *cnc,
515 			   GdaMetaStore *store, GdaMetaContext *context, GError **error)
516 {
517 	GdaDataModel *model, *tables;
518 	gboolean retval = FALSE;
519 	gint i, nrows;
520 	OracleConnectionData *cdata;
521 
522 	cdata = (OracleConnectionData*) gda_connection_internal_get_provider_data_error (cnc, error);
523 	if (!cdata)
524 		return FALSE;
525 
526 	/* use a prepared statement for the "base" model */
527 	tables = gda_connection_statement_execute_select (cnc, internal_stmt[I_STMT_TABLES_ALL_RAW], NULL, error);
528 	if (!tables)
529 		return FALSE;
530 
531 	model = gda_data_model_array_new_with_g_types (24, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
532 						       G_TYPE_INT, G_TYPE_STRING, G_TYPE_BOOLEAN,
533 						       G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
534 						       G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT,
535 						       G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
536 						       G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
537 						       G_TYPE_BOOLEAN, G_TYPE_STRING);
538 
539 	/* fill in @model */
540 	const GValue *cv0 = NULL;
541 	GList *values = NULL;
542 	nrows = gda_data_model_get_n_rows (tables);
543 	for (i = 0; i < nrows; i++) {
544 		const GValue *cv1, *cv2;
545 		values = NULL;
546 
547 		if (!cv0) {
548 			cv0 = gda_data_model_get_value_at (tables, 0, i, error);
549 			if (!cv0)
550 				goto out;
551 		}
552 		if (!(cv1 = gda_data_model_get_value_at (tables, 1, i, error)) ||
553 		    !(cv2 = gda_data_model_get_value_at (tables, 2, i, error)))
554 			goto out;
555 
556 		/* Allocate the Describe handle */
557 		int result;
558 		OCIDescribe *dschp = (OCIDescribe *) 0;
559 		GdaConnectionEvent *event;
560 
561 		result = OCIHandleAlloc ((dvoid *) cdata->henv,
562 					 (dvoid **) &dschp,
563 					 (ub4) OCI_HTYPE_DESCRIBE,
564 					 (size_t) 0,
565 					 (dvoid **) 0);
566 		if ((event = gda_oracle_check_result ((result), (cnc), (cdata), OCI_HTYPE_ERROR,
567 						      _("Could not fetch next row")))) {
568 			g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_DATA_ERROR,
569 				     "%s", gda_connection_event_get_description (event));
570 			goto out;
571 		}
572 
573 		/* Describe the table */
574 		gchar *fq_tblname;
575 		const gchar *schema_name, *table_name;
576 		GValue *v1, *v2;
577 		v1 = oracle_identifier_to_value (g_value_get_string (cv1));
578 		schema_name = g_value_get_string (v1);
579 		v2 = oracle_identifier_to_value (g_value_get_string (cv2));
580 		table_name = g_value_get_string (v2);
581 		fq_tblname = g_strdup_printf ("%s.%s", schema_name, table_name);
582 		gda_value_free (v1);
583 		gda_value_free (v2);
584 
585 		result = OCIDescribeAny (cdata->hservice,
586 					 cdata->herr,
587 					 (text *) fq_tblname,
588 					 strlen (fq_tblname),
589 					 OCI_OTYPE_NAME,
590 					 0,
591 					 OCI_PTYPE_UNK,
592 					 (OCIDescribe *) dschp);
593 		g_free (fq_tblname);
594 		if ((event = gda_oracle_check_result ((result), (cnc), (cdata), OCI_HTYPE_ERROR,
595 						      _("Could not get a description handle")))) {
596 			g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_DATA_ERROR,
597 				     "%s", gda_connection_event_get_description (event));
598 			OCIHandleFree ((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
599 			goto out;
600 		}
601 
602 
603 		/* Get the parameter handle */
604 		OCIParam *parmh;
605 		result = OCIAttrGet ((dvoid *) dschp,
606 				     (ub4) OCI_HTYPE_DESCRIBE,
607 				     (dvoid **) &parmh,
608 				     (ub4 *) 0,
609 				     (ub4) OCI_ATTR_PARAM,
610 				     (OCIError *) cdata->herr);
611 		if ((event = gda_oracle_check_result ((result), (cnc), (cdata), OCI_HTYPE_ERROR,
612 						      _("Could not get parameter handle")))) {
613 			g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_DATA_ERROR,
614 				     "%s", gda_connection_event_get_description (event));
615 			OCIHandleFree ((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
616 			goto out;
617 		}
618 
619 		/* Get the number of columns */
620 		ub2 numcols;
621 		OCIParam *collsthd;
622 		result = OCIAttrGet ((dvoid *) parmh,
623 				     (ub4) OCI_DTYPE_PARAM,
624 				     (dvoid *) &numcols,
625 				     (ub4 *) 0,
626 				     (ub4) OCI_ATTR_NUM_COLS,
627 				     (OCIError *) cdata->herr);
628 		if ((event = gda_oracle_check_result ((result), (cnc), (cdata), OCI_HTYPE_ERROR,
629 						      _("Could not get attribute")))) {
630 			g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_DATA_ERROR,
631 				     "%s", gda_connection_event_get_description (event));
632 			OCIHandleFree ((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
633 			goto out;
634 		}
635 
636 		result = OCIAttrGet ((dvoid *) parmh,
637 				     (ub4) OCI_DTYPE_PARAM,
638 				     (dvoid *) &collsthd,
639 				     (ub4 *) 0,
640 				     (ub4) OCI_ATTR_LIST_COLUMNS,
641 				     (OCIError *) cdata->herr);
642 		if ((event = gda_oracle_check_result ((result), (cnc), (cdata), OCI_HTYPE_ERROR,
643 						      _("Could not get attribute")))) {
644 			g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_DATA_ERROR,
645 				     "%s", gda_connection_event_get_description (event));
646 			OCIHandleFree ((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
647 			goto out;
648 		}
649 
650 		/* fetch information for each column, loop starts at 1! */
651 		gint col;
652 		for (col = 1; col <= numcols; col++) {
653 			/* column's catalog, schema, table */
654 			GValue *v;
655 			values = g_list_prepend (NULL, (gpointer) cv0);
656 			v = oracle_identifier_to_value (g_value_get_string (cv1));
657 			values = g_list_prepend (values, v);
658 			v = oracle_identifier_to_value (g_value_get_string (cv2));
659 			values = g_list_prepend (values, v);
660 
661 			/* Get the column handle */
662 			OCIParam *colhd;
663 			result = OCIParamGet ((dvoid *) collsthd,
664 					      (ub4) OCI_DTYPE_PARAM,
665 					      (OCIError *) cdata->herr,
666 					      (dvoid **) &colhd,
667 					      (ub2) col);
668 			if ((event = gda_oracle_check_result ((result), (cnc), (cdata), OCI_HTYPE_ERROR,
669 							      _("Could not get attribute")))) {
670 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_DATA_ERROR,
671 					     "%s", gda_connection_event_get_description (event));
672 				OCIHandleFree ((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
673 				goto out;
674 			}
675 
676 			/* Field name */
677 			text *strp;
678 			ub4 sizep;
679 			result = OCIAttrGet ((dvoid *) colhd,
680 					     (ub4) OCI_DTYPE_PARAM,
681 					     (dvoid *) &strp,
682 					     (ub4 *) &sizep,
683 					     (ub4) OCI_ATTR_NAME,
684 					     (OCIError *) cdata->herr);
685 			if ((event = gda_oracle_check_result ((result), (cnc), (cdata), OCI_HTYPE_ERROR,
686 							      _("Could not get attribute")))) {
687 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_DATA_ERROR,
688 					     "%s", gda_connection_event_get_description (event));
689 				OCIDescriptorFree ((dvoid *) colhd, OCI_DTYPE_PARAM);
690 				OCIHandleFree ((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
691 				goto out;
692 			}
693 			gchar *tmpname;
694 			tmpname = (gchar*) g_malloc (sizep + 1);
695 			strncpy (tmpname, strp, sizep);
696 			tmpname[sizep] = 0;
697 			v = oracle_identifier_to_value (tmpname);
698 			g_free (tmpname);
699 			values = g_list_prepend (values, v);
700 
701 			/* ordinal position */
702 			g_value_set_int ((v = gda_value_new (G_TYPE_INT)), col);
703 			values = g_list_prepend (values, v);
704 
705 			/* default */
706 			values = g_list_prepend (values, gda_value_new_null ());
707 
708 			/* Not null? */
709 			ub1 nullable;
710 			result = OCIAttrGet ((dvoid *)colhd,
711 					     (ub4) OCI_DTYPE_PARAM,
712 					     (dvoid *) &nullable,
713 					     (ub4 *) 0,
714 					     (ub4) OCI_ATTR_IS_NULL,
715 					     (OCIError *) cdata->herr);
716 			if ((event = gda_oracle_check_result ((result), (cnc), (cdata), OCI_HTYPE_ERROR,
717 							      _("Could not get attribute")))) {
718 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_DATA_ERROR,
719 					     "%s", gda_connection_event_get_description (event));
720 				OCIDescriptorFree ((dvoid *) colhd, OCI_DTYPE_PARAM);
721 				OCIHandleFree ((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
722 				goto out;
723 			}
724 			g_value_set_boolean ((v = gda_value_new (G_TYPE_BOOLEAN)), ! (nullable > 0));
725 			values = g_list_prepend (values, v);
726 
727 			/* Data type */
728 			ub2 type;
729 			ub1 precision;
730 			sb1 scale;
731 			ub4 char_used;
732 			ub2 char_size = 0;
733 			ub4 size;
734 			result = OCIAttrGet ((dvoid *)colhd,
735 					     (ub4) OCI_DTYPE_PARAM,
736 					     (dvoid *) &type,
737 					     (ub4 *) 0,
738 					     (ub4) OCI_ATTR_DATA_TYPE,
739 					     (OCIError *) cdata->herr);
740 			if ((event = gda_oracle_check_result ((result), (cnc), (cdata), OCI_HTYPE_ERROR,
741 							      _("Could not get attribute")))) {
742 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_DATA_ERROR,
743 					     "%s", gda_connection_event_get_description (event));
744 				OCIDescriptorFree ((dvoid *) colhd, OCI_DTYPE_PARAM);
745 				OCIHandleFree ((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
746 				goto out;
747 			}
748 
749 			result = OCIAttrGet ((dvoid *)colhd,
750 					     (ub4) OCI_DTYPE_PARAM,
751 					     (dvoid *) &precision,
752 					     (ub4 *) 0,
753 					     (ub4) OCI_ATTR_PRECISION,
754 					     (OCIError *) cdata->herr);
755 			if ((event = gda_oracle_check_result ((result), (cnc), (cdata), OCI_HTYPE_ERROR,
756 							      _("Could not get attribute")))) {
757 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_DATA_ERROR,
758 					     "%s", gda_connection_event_get_description (event));
759 				OCIDescriptorFree ((dvoid *) colhd, OCI_DTYPE_PARAM);
760 				OCIHandleFree ((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
761 				goto out;
762 			}
763 
764 			result = OCIAttrGet ((dvoid *)colhd,
765 					     (ub4) OCI_DTYPE_PARAM,
766 					     (dvoid *) &scale,
767 					     (ub4 *) 0,
768 					     (ub4) OCI_ATTR_SCALE,
769 					     (OCIError *) cdata->herr);
770 			if ((event = gda_oracle_check_result ((result), (cnc), (cdata), OCI_HTYPE_ERROR,
771 							      _("Could not get attribute")))) {
772 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_DATA_ERROR,
773 					     "%s", gda_connection_event_get_description (event));
774 				OCIDescriptorFree ((dvoid *) colhd, OCI_DTYPE_PARAM);
775 				OCIHandleFree ((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
776 				goto out;
777 			}
778 
779 			result = OCIAttrGet ((dvoid *)colhd,
780 					     (ub4) OCI_DTYPE_PARAM,
781 					     (dvoid *) &char_used,
782 					     (ub4 *) 0,
783 					     (ub4) OCI_ATTR_CHAR_USED,
784 					     (OCIError *) cdata->herr);
785 			if ((event = gda_oracle_check_result ((result), (cnc), (cdata), OCI_HTYPE_ERROR,
786 							      _("Could not get attribute")))) {
787 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_DATA_ERROR,
788 					     "%s", gda_connection_event_get_description (event));
789 				OCIDescriptorFree ((dvoid *) colhd, OCI_DTYPE_PARAM);
790 				OCIHandleFree ((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
791 				goto out;
792 			}
793 			if (char_used) {
794 				result = OCIAttrGet ((dvoid *)colhd,
795 						     (ub4) OCI_DTYPE_PARAM,
796 						     (dvoid *) &char_size,
797 						     (ub4 *) 0,
798 						     (ub4) OCI_ATTR_CHAR_SIZE,
799 						     (OCIError *) cdata->herr);
800 				if ((event = gda_oracle_check_result ((result), (cnc), (cdata), OCI_HTYPE_ERROR,
801 								      _("Could not get attribute")))) {
802 					g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_DATA_ERROR,
803 						     "%s", gda_connection_event_get_description (event));
804 					OCIDescriptorFree ((dvoid *) colhd, OCI_DTYPE_PARAM);
805 					OCIHandleFree ((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
806 					goto out;
807 				}
808 			}
809 
810 			result = OCIAttrGet ((dvoid *)colhd,
811 					     (ub4) OCI_DTYPE_PARAM,
812 					     (dvoid *) &size,
813 					     (ub4 *) 0,
814 					     (ub4) OCI_ATTR_DATA_SIZE,
815 					     (OCIError *) cdata->herr);
816 			if ((event = gda_oracle_check_result ((result), (cnc), (cdata), OCI_HTYPE_ERROR,
817 							      _("Could not get attribute")))) {
818 				g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_DATA_ERROR,
819 					     "%s", gda_connection_event_get_description (event));
820 				OCIDescriptorFree ((dvoid *) colhd, OCI_DTYPE_PARAM);
821 				OCIHandleFree ((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
822 				goto out;
823 			}
824 
825 
826 			g_value_set_string ((v = gda_value_new (G_TYPE_STRING)), _oracle_sqltype_to_string (type));
827 			values = g_list_prepend (values, v);
828 
829 			/* array spec */
830 			values = g_list_prepend (values, gda_value_new_null ());
831 
832 			/* GType */
833 			const gchar *ctmp;
834 			ctmp = g_type_name (_oracle_sqltype_to_g_type (type, precision, scale));
835 			g_value_set_string ((v = gda_value_new (G_TYPE_STRING)),
836 					    ctmp ? ctmp : "GdaBinary");
837 			values = g_list_prepend (values, v);
838 
839 			if (char_used) {
840 				/* character_maximum_length */
841 				g_value_set_int ((v = gda_value_new (G_TYPE_INT)), char_size);
842 				values = g_list_prepend (values, v);
843 
844 				/* character_octet_length */
845 				g_value_set_int ((v = gda_value_new (G_TYPE_INT)), size);
846 				values = g_list_prepend (values, v);
847 
848 				/* numeric_precision */
849 				values = g_list_prepend (values, gda_value_new_null ());
850 
851 				/* numeric_scale */
852 				values = g_list_prepend (values, gda_value_new_null ());
853 			}
854 			else {
855 				/* REM: size==22 for NUMBERS */
856 				/* character_maximum_length */
857 				values = g_list_prepend (values, gda_value_new_null ());
858 
859 				/* character_octet_length */
860 				if (size == 22)
861 					values = g_list_prepend (values, gda_value_new_null ());
862 				else {
863 					g_value_set_int ((v = gda_value_new (G_TYPE_INT)), size);
864 					values = g_list_prepend (values, v);
865 				}
866 
867 				/* numeric_precision */
868 				g_value_set_int ((v = gda_value_new (G_TYPE_INT)), precision);
869 				values = g_list_prepend (values, v);
870 
871 				/* numeric_scale */
872 				g_value_set_int ((v = gda_value_new (G_TYPE_INT)), scale);
873 				values = g_list_prepend (values, v);
874 			}
875 
876 			/* datetime_precision */
877 			values = g_list_prepend (values, gda_value_new_null ());
878 
879 			/* character_set_catalog */
880 			values = g_list_prepend (values, gda_value_new_null ());
881 
882 			/* character_set_schema */
883 			values = g_list_prepend (values, gda_value_new_null ());
884 
885 			/* character_set_name: see NLS_CHARSET_NAME and OCI_ATTR_CHARSET_ID */
886 			values = g_list_prepend (values, gda_value_new_null ());
887 
888 			/* collation_catalog */
889 			values = g_list_prepend (values, gda_value_new_null ());
890 
891 			/* collation_schema */
892 			values = g_list_prepend (values, gda_value_new_null ());
893 
894 			/* collation_name */
895 			values = g_list_prepend (values, gda_value_new_null ());
896 
897 			/* extra */
898 			values = g_list_prepend (values, gda_value_new_null ());
899 
900 			/* is_updatable */
901 			values = g_list_prepend (values, gda_value_new_null ());
902 
903 			/* column_comments */
904 			values = g_list_prepend (values, gda_value_new_null ());
905 
906 			/* add to @model */
907 			gint newrow;
908 			values = g_list_reverse (values);
909 			newrow = gda_data_model_append_values (model, values, error);
910 
911 			/* free values */
912 			g_list_foreach (values->next, (GFunc) gda_value_free, NULL);
913 			g_list_free (values);
914 			values = NULL;
915 			if (newrow == -1)
916 				goto out;
917 		}
918 
919 		OCIHandleFree ((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
920 	}
921 	retval = TRUE;
922 
923  out:
924 	if (values) {
925 		/* in case of error */
926 		values = g_list_reverse (values);
927 		g_list_foreach (values->next, (GFunc) gda_value_free, NULL);
928 		g_list_free (values);
929 	}
930 
931 	/* modify meta store with @model */
932 	if (retval) {
933 		/*
934 		FILE *out;
935 		out = fopen ("_columns", "w");
936 		gda_data_model_dump (model, out);
937 		fclose (out);
938 		*/
939 
940 		gda_meta_store_set_identifiers_style (store, GDA_SQL_IDENTIFIERS_UPPER_CASE);
941 		retval = gda_meta_store_modify_with_context (store, context, model, error);
942 	}
943 	g_object_unref (tables);
944 	g_object_unref (model);
945 
946 	return retval;
947 }
948 
949 gboolean
_gda_oracle_meta_columns(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * table_catalog,const GValue * table_schema,const GValue * table_name)950 _gda_oracle_meta_columns (GdaServerProvider *prov, GdaConnection *cnc,
951 			  GdaMetaStore *store, GdaMetaContext *context, GError **error,
952 			  const GValue *table_catalog, const GValue *table_schema,
953 			  const GValue *table_name)
954 {
955 	TO_IMPLEMENT;
956 	return TRUE;
957 }
958 
959 gboolean
_gda_oracle_meta__view_cols(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)960 _gda_oracle_meta__view_cols (GdaServerProvider *prov, GdaConnection *cnc,
961 			   GdaMetaStore *store, GdaMetaContext *context, GError **error)
962 {
963 	TO_IMPLEMENT;
964 	return TRUE;
965 }
966 
967 gboolean
_gda_oracle_meta_view_cols(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * view_catalog,const GValue * view_schema,const GValue * view_name)968 _gda_oracle_meta_view_cols (GdaServerProvider *prov, GdaConnection *cnc,
969 			  GdaMetaStore *store, GdaMetaContext *context, GError **error,
970 			  const GValue *view_catalog, const GValue *view_schema,
971 			  const GValue *view_name)
972 {
973 	TO_IMPLEMENT;
974 	return TRUE;
975 }
976 
977 gboolean
_gda_oracle_meta__constraints_tab(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)978 _gda_oracle_meta__constraints_tab (GdaServerProvider *prov, GdaConnection *cnc,
979 				 GdaMetaStore *store, GdaMetaContext *context, GError **error)
980 {
981 	TO_IMPLEMENT;
982 	return TRUE;
983 }
984 
985 gboolean
_gda_oracle_meta_constraints_tab(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * table_catalog,const GValue * table_schema,const GValue * table_name,const GValue * constraint_name_n)986 _gda_oracle_meta_constraints_tab (GdaServerProvider *prov, GdaConnection *cnc,
987 				GdaMetaStore *store, GdaMetaContext *context, GError **error,
988 				const GValue *table_catalog, const GValue *table_schema,
989 				const GValue *table_name, const GValue *constraint_name_n)
990 {
991 	TO_IMPLEMENT;
992 	return TRUE;
993 }
994 
995 gboolean
_gda_oracle_meta__constraints_ref(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)996 _gda_oracle_meta__constraints_ref (GdaServerProvider *prov, GdaConnection *cnc,
997 				 GdaMetaStore *store, GdaMetaContext *context, GError **error)
998 {
999 	TO_IMPLEMENT;
1000 	return TRUE;
1001 }
1002 
1003 gboolean
_gda_oracle_meta_constraints_ref(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * table_catalog,const GValue * table_schema,const GValue * table_name,const GValue * constraint_name)1004 _gda_oracle_meta_constraints_ref (GdaServerProvider *prov, GdaConnection *cnc,
1005 				GdaMetaStore *store, GdaMetaContext *context, GError **error,
1006 				const GValue *table_catalog, const GValue *table_schema, const GValue *table_name,
1007 				const GValue *constraint_name)
1008 {
1009 	TO_IMPLEMENT;
1010 	return TRUE;
1011 }
1012 
1013 gboolean
_gda_oracle_meta__key_columns(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)1014 _gda_oracle_meta__key_columns (GdaServerProvider *prov, GdaConnection *cnc,
1015 			     GdaMetaStore *store, GdaMetaContext *context, GError **error)
1016 {
1017 	TO_IMPLEMENT;
1018 	return TRUE;
1019 }
1020 
1021 gboolean
_gda_oracle_meta_key_columns(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * table_catalog,const GValue * table_schema,const GValue * table_name,const GValue * constraint_name)1022 _gda_oracle_meta_key_columns (GdaServerProvider *prov, GdaConnection *cnc,
1023 			    GdaMetaStore *store, GdaMetaContext *context, GError **error,
1024 			    const GValue *table_catalog, const GValue *table_schema,
1025 			    const GValue *table_name, const GValue *constraint_name)
1026 {
1027 	TO_IMPLEMENT;
1028 	return TRUE;
1029 }
1030 
1031 gboolean
_gda_oracle_meta__check_columns(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)1032 _gda_oracle_meta__check_columns (GdaServerProvider *prov, GdaConnection *cnc,
1033 			       GdaMetaStore *store, GdaMetaContext *context, GError **error)
1034 {
1035 	TO_IMPLEMENT;
1036 	return TRUE;
1037 }
1038 
1039 gboolean
_gda_oracle_meta_check_columns(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * table_catalog,const GValue * table_schema,const GValue * table_name,const GValue * constraint_name)1040 _gda_oracle_meta_check_columns (GdaServerProvider *prov, GdaConnection *cnc,
1041 			      GdaMetaStore *store, GdaMetaContext *context, GError **error,
1042 			      const GValue *table_catalog, const GValue *table_schema,
1043 			      const GValue *table_name, const GValue *constraint_name)
1044 {
1045 	TO_IMPLEMENT;
1046 	return TRUE;
1047 }
1048 
1049 gboolean
_gda_oracle_meta__triggers(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)1050 _gda_oracle_meta__triggers (GdaServerProvider *prov, GdaConnection *cnc,
1051 			  GdaMetaStore *store, GdaMetaContext *context, GError **error)
1052 {
1053 	TO_IMPLEMENT;
1054 	return TRUE;
1055 }
1056 
1057 gboolean
_gda_oracle_meta_triggers(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * table_catalog,const GValue * table_schema,const GValue * table_name)1058 _gda_oracle_meta_triggers (GdaServerProvider *prov, GdaConnection *cnc,
1059 			 GdaMetaStore *store, GdaMetaContext *context, GError **error,
1060 			 const GValue *table_catalog, const GValue *table_schema,
1061 			 const GValue *table_name)
1062 {
1063 	TO_IMPLEMENT;
1064 	return TRUE;
1065 }
1066 
1067 gboolean
_gda_oracle_meta__routines(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)1068 _gda_oracle_meta__routines (GdaServerProvider *prov, GdaConnection *cnc,
1069 			  GdaMetaStore *store, GdaMetaContext *context, GError **error)
1070 {
1071 	TO_IMPLEMENT;
1072 	return TRUE;
1073 }
1074 
1075 gboolean
_gda_oracle_meta_routines(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * routine_catalog,const GValue * routine_schema,const GValue * routine_name_n)1076 _gda_oracle_meta_routines (GdaServerProvider *prov, GdaConnection *cnc,
1077 			 GdaMetaStore *store, GdaMetaContext *context, GError **error,
1078 			 const GValue *routine_catalog, const GValue *routine_schema,
1079 			 const GValue *routine_name_n)
1080 {
1081 	TO_IMPLEMENT;
1082 	return TRUE;
1083 }
1084 
1085 gboolean
_gda_oracle_meta__routine_col(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)1086 _gda_oracle_meta__routine_col (GdaServerProvider *prov, GdaConnection *cnc,
1087 			     GdaMetaStore *store, GdaMetaContext *context, GError **error)
1088 {
1089 	TO_IMPLEMENT;
1090 	return TRUE;
1091 }
1092 
1093 gboolean
_gda_oracle_meta_routine_col(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * rout_catalog,const GValue * rout_schema,const GValue * rout_name)1094 _gda_oracle_meta_routine_col (GdaServerProvider *prov, GdaConnection *cnc,
1095 			    GdaMetaStore *store, GdaMetaContext *context, GError **error,
1096 			    const GValue *rout_catalog, const GValue *rout_schema,
1097 			    const GValue *rout_name)
1098 {
1099 	TO_IMPLEMENT;
1100 	return TRUE;
1101 }
1102 
1103 gboolean
_gda_oracle_meta__routine_par(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)1104 _gda_oracle_meta__routine_par (GdaServerProvider *prov, GdaConnection *cnc,
1105 			     GdaMetaStore *store, GdaMetaContext *context, GError **error)
1106 {
1107 	TO_IMPLEMENT;
1108 	return TRUE;
1109 }
1110 
1111 gboolean
_gda_oracle_meta_routine_par(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * rout_catalog,const GValue * rout_schema,const GValue * rout_name)1112 _gda_oracle_meta_routine_par (GdaServerProvider *prov, GdaConnection *cnc,
1113 			    GdaMetaStore *store, GdaMetaContext *context, GError **error,
1114 			    const GValue *rout_catalog, const GValue *rout_schema,
1115 			    const GValue *rout_name)
1116 {
1117 	TO_IMPLEMENT;
1118 	return TRUE;
1119 }
1120 
1121 gboolean
_gda_oracle_meta__indexes_tab(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)1122 _gda_oracle_meta__indexes_tab (GdaServerProvider *prov, GdaConnection *cnc,
1123 			       GdaMetaStore *store, GdaMetaContext *context, GError **error)
1124 {
1125 	TO_IMPLEMENT;
1126 	return TRUE;
1127 }
1128 
1129 gboolean
_gda_oracle_meta_indexes_tab(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * table_catalog,const GValue * table_schema,const GValue * table_name,const GValue * index_name_n)1130 _gda_oracle_meta_indexes_tab (GdaServerProvider *prov, GdaConnection *cnc,
1131 			      GdaMetaStore *store, GdaMetaContext *context, GError **error,
1132 			      const GValue *table_catalog, const GValue *table_schema, const GValue *table_name,
1133 			      const GValue *index_name_n)
1134 {
1135 	TO_IMPLEMENT;
1136 	return TRUE;
1137 }
1138 
1139 gboolean
_gda_oracle_meta__index_cols(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error)1140 _gda_oracle_meta__index_cols (GdaServerProvider *prov, GdaConnection *cnc,
1141 			      GdaMetaStore *store, GdaMetaContext *context, GError **error)
1142 {
1143 	TO_IMPLEMENT;
1144 	return TRUE;
1145 }
1146 
1147 gboolean
_gda_oracle_meta_index_cols(GdaServerProvider * prov,GdaConnection * cnc,GdaMetaStore * store,GdaMetaContext * context,GError ** error,const GValue * table_catalog,const GValue * table_schema,const GValue * table_name,const GValue * index_name)1148 _gda_oracle_meta_index_cols (GdaServerProvider *prov, GdaConnection *cnc,
1149 			     GdaMetaStore *store, GdaMetaContext *context, GError **error,
1150 			     const GValue *table_catalog, const GValue *table_schema,
1151 			     const GValue *table_name, const GValue *index_name)
1152 {
1153 	TO_IMPLEMENT;
1154 	return TRUE;
1155 }
1156