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