[libgda] Improved Oracle meta data fetching
- From: Vivien Malerba <vivien src gnome org>
- To: svn-commits-list gnome org
- Subject: [libgda] Improved Oracle meta data fetching
- Date: Fri, 8 May 2009 09:52:37 -0400 (EDT)
commit 42a2edbcb56ed4dec6db2a8e96d2aa72cf35dad1
Author: Vivien Malerba <malerba gnome-db org>
Date: Fri May 8 15:44:20 2009 +0200
Improved Oracle meta data fetching
* po/POTFILES.in: added missing file
* providers/oracle/gda-oracle-meta.c: misc. improvements
---
ChangeLog | 5 ++
po/POTFILES.in | 1 +
providers/oracle/gda-oracle-meta.c | 95 +++++++++++++++++++++++++++++++----
3 files changed, 90 insertions(+), 11 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 3304616..47b5c78 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2009-05-08 Vivien Malerba <malerba gnome-db org>
+
+ * po/POTFILES.in: added missing file
+ * providers/oracle/gda-oracle-meta.c: misc. improvements
+
2009-05-06 Vivien Malerba <malerba gnome-db org>
* tools/Makefile.am: install web server data files in the same dir as
diff --git a/po/POTFILES.in b/po/POTFILES.in
old mode 100644
new mode 100755
index a68b8e9..9467b70
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -104,6 +104,7 @@ providers/mysql/mysql_specs_drop_view.xml.in
providers/mysql/mysql_specs_dsn.xml.in
providers/mysql/mysql_specs_rename_table.xml.in
providers/oracle/gda-oracle-ddl.c
+providers/oracle/gda-oracle-meta.c
providers/oracle/gda-oracle-util.c
providers/oracle/oracle_specs_create_table.xml.in
providers/postgres/gda-postgres-blob-op.c
diff --git a/providers/oracle/gda-oracle-meta.c b/providers/oracle/gda-oracle-meta.c
index 06e5fc1..76e2db7 100644
--- a/providers/oracle/gda-oracle-meta.c
+++ b/providers/oracle/gda-oracle-meta.c
@@ -730,6 +730,9 @@ _gda_oracle_meta__columns (GdaServerProvider *prov, GdaConnection *cnc,
ub2 type;
ub1 precision;
sb1 scale;
+ ub4 char_used;
+ ub2 char_size = 0;
+ ub4 size;
result = OCIAttrGet ((dvoid *)colhd,
(ub4) OCI_DTYPE_PARAM,
(dvoid *) &type,
@@ -775,6 +778,53 @@ _gda_oracle_meta__columns (GdaServerProvider *prov, GdaConnection *cnc,
goto out;
}
+ result = OCIAttrGet ((dvoid *)colhd,
+ (ub4) OCI_DTYPE_PARAM,
+ (dvoid *) &char_used,
+ (ub4 *) 0,
+ (ub4) OCI_ATTR_CHAR_USED,
+ (OCIError *) cdata->herr);
+ if ((event = gda_oracle_check_result ((result), (cnc), (cdata), OCI_HTYPE_ERROR,
+ _("Could not get attribute")))) {
+ g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_DATA_ERROR,
+ "%s", gda_connection_event_get_description (event));
+ OCIDescriptorFree ((dvoid *) colhd, OCI_DTYPE_PARAM);
+ OCIHandleFree ((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
+ goto out;
+ }
+ if (char_used) {
+ result = OCIAttrGet ((dvoid *)colhd,
+ (ub4) OCI_DTYPE_PARAM,
+ (dvoid *) &char_size,
+ (ub4 *) 0,
+ (ub4) OCI_ATTR_CHAR_SIZE,
+ (OCIError *) cdata->herr);
+ if ((event = gda_oracle_check_result ((result), (cnc), (cdata), OCI_HTYPE_ERROR,
+ _("Could not get attribute")))) {
+ g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_DATA_ERROR,
+ "%s", gda_connection_event_get_description (event));
+ OCIDescriptorFree ((dvoid *) colhd, OCI_DTYPE_PARAM);
+ OCIHandleFree ((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
+ goto out;
+ }
+ }
+
+ result = OCIAttrGet ((dvoid *)colhd,
+ (ub4) OCI_DTYPE_PARAM,
+ (dvoid *) &size,
+ (ub4 *) 0,
+ (ub4) OCI_ATTR_DATA_SIZE,
+ (OCIError *) cdata->herr);
+ if ((event = gda_oracle_check_result ((result), (cnc), (cdata), OCI_HTYPE_ERROR,
+ _("Could not get attribute")))) {
+ g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_DATA_ERROR,
+ "%s", gda_connection_event_get_description (event));
+ OCIDescriptorFree ((dvoid *) colhd, OCI_DTYPE_PARAM);
+ OCIHandleFree ((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
+ goto out;
+ }
+
+
g_value_set_string ((v = gda_value_new (G_TYPE_STRING)), _oracle_sqltype_to_string (type));
values = g_list_prepend (values, v);
@@ -788,19 +838,42 @@ _gda_oracle_meta__columns (GdaServerProvider *prov, GdaConnection *cnc,
ctmp ? ctmp : "GdaBinary");
values = g_list_prepend (values, v);
- /* character_maximum_length */
- values = g_list_prepend (values, gda_value_new_null ());
+ if (char_used) {
+ /* character_maximum_length */
+ g_value_set_int ((v = gda_value_new (G_TYPE_INT)), char_size);
+ values = g_list_prepend (values, v);
- /* character_octet_length */
- values = g_list_prepend (values, gda_value_new_null ());
+ /* character_octet_length */
+ g_value_set_int ((v = gda_value_new (G_TYPE_INT)), size);
+ values = g_list_prepend (values, v);
- /* numeric_precision */
- g_value_set_int ((v = gda_value_new (G_TYPE_INT)), precision);
- values = g_list_prepend (values, v);
+ /* numeric_precision */
+ values = g_list_prepend (values, gda_value_new_null ());
- /* numeric_scale */
- g_value_set_int ((v = gda_value_new (G_TYPE_INT)), scale);
- values = g_list_prepend (values, v);
+ /* numeric_scale */
+ values = g_list_prepend (values, gda_value_new_null ());
+ }
+ else {
+ /* REM: size==22 for NUMBERS */
+ /* character_maximum_length */
+ values = g_list_prepend (values, gda_value_new_null ());
+
+ /* character_octet_length */
+ if (size == 22)
+ values = g_list_prepend (values, gda_value_new_null ());
+ else {
+ g_value_set_int ((v = gda_value_new (G_TYPE_INT)), size);
+ values = g_list_prepend (values, v);
+ }
+
+ /* numeric_precision */
+ g_value_set_int ((v = gda_value_new (G_TYPE_INT)), precision);
+ values = g_list_prepend (values, v);
+
+ /* numeric_scale */
+ g_value_set_int ((v = gda_value_new (G_TYPE_INT)), scale);
+ values = g_list_prepend (values, v);
+ }
/* datetime_precision */
values = g_list_prepend (values, gda_value_new_null ());
@@ -811,7 +884,7 @@ _gda_oracle_meta__columns (GdaServerProvider *prov, GdaConnection *cnc,
/* character_set_schema */
values = g_list_prepend (values, gda_value_new_null ());
- /* character_set_name */
+ /* character_set_name: see NLS_CHARSET_NAME and OCI_ATTR_CHARSET_ID */
values = g_list_prepend (values, gda_value_new_null ());
/* collation_catalog */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]