[libgda/LIBGDA_4.0] Fetch indexes information for MySQL
- From: Vivien Malerba <vivien src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [libgda/LIBGDA_4.0] Fetch indexes information for MySQL
- Date: Sat, 6 Feb 2010 16:19:54 +0000 (UTC)
commit 1d205bbea37e1cdc9746acd7b270f35b3ed7771c
Author: Vivien Malerba <malerba gnome-db org>
Date: Sat Feb 6 14:15:43 2010 +0100
Fetch indexes information for MySQL
providers/mysql/gda-mysql-meta.c | 173 +++++++++++++++++++++++++++++++++++---
1 files changed, 161 insertions(+), 12 deletions(-)
---
diff --git a/providers/mysql/gda-mysql-meta.c b/providers/mysql/gda-mysql-meta.c
index bf1c695..7893b9d 100644
--- a/providers/mysql/gda-mysql-meta.c
+++ b/providers/mysql/gda-mysql-meta.c
@@ -1,5 +1,5 @@
/* GDA mysql provider
- * Copyright (C) 2008 The GNOME Foundation.
+ * Copyright (C) 2008 - 2010 The GNOME Foundation.
*
* AUTHORS:
* Carlos Savoretti <csavoretti gmail com>
@@ -34,6 +34,7 @@
#include <libgda/gda-data-model-array.h>
#include <libgda/gda-set.h>
#include <libgda/gda-holder.h>
+#include <libgda/providers-support/gda-meta-column-types.h>
/*
* predefined statements' IDs
@@ -81,9 +82,15 @@ typedef enum {
I_STMT_ROUTINES,
I_STMT_ROUTINES_ONE,
I_STMT_ROUTINES_PAR_ALL,
- I_STMT_ROUTINES_PAR/* , */
+ I_STMT_ROUTINES_PAR,
/* I_STMT_ROUTINES_COL_ALL, */
- /* I_STMT_ROUTINES_COL */
+ /* I_STMT_ROUTINES_COL, */
+
+ I_STMT_INDEXES_ALL,
+ I_STMT_INDEXES_TABLE,
+ I_STMT_INDEXES_ONE,
+ I_STMT_INDEX_COLUMNS_ALL,
+ I_STMT_INDEX_COLUMNS_NAMED
} InternalStatementItem;
@@ -213,6 +220,20 @@ static gchar *internal_sql[] = {
/* I_STMT_ROUTINES_COL */
+ /* I_STMT_INDEXES_ALL */
+ "SELECT DISTINCT " CATALOG_NAME ", INDEX_SCHEMA, INDEX_NAME, " CATALOG_NAME ", TABLE_SCHEMA, TABLE_NAME, NOT NON_UNIQUE, NULL, INDEX_TYPE, NULL, NULL, COMMENT FROM INFORMATION_SCHEMA.STATISTICS WHERE INDEX_NAME <> 'PRIMARY'",
+
+ /* I_STMT_INDEXES_TABLE */
+ "SELECT DISTINCT " CATALOG_NAME ", INDEX_SCHEMA, INDEX_NAME, " CATALOG_NAME ", TABLE_SCHEMA, TABLE_NAME, NOT NON_UNIQUE, NULL, INDEX_TYPE, NULL, NULL, COMMENT FROM INFORMATION_SCHEMA.STATISTICS WHERE INDEX_NAME <> 'PRIMARY' AND TABLE_SCHEMA = BINARY ##schema::string AND TABLE_NAME = BINARY ##name::string",
+
+ /* I_STMT_INDEXES_ONE */
+ "SELECT DISTINCT " CATALOG_NAME ", INDEX_SCHEMA, INDEX_NAME, " CATALOG_NAME ", TABLE_SCHEMA, TABLE_NAME, NOT NON_UNIQUE, NULL, INDEX_TYPE, NULL, NULL, COMMENT FROM INFORMATION_SCHEMA.STATISTICS WHERE INDEX_NAME <> 'PRIMARY' AND TABLE_SCHEMA = BINARY ##schema::string AND TABLE_NAME = BINARY ##name::string AND INDEX_NAME = ##name2::string",
+
+ /* I_STMT_INDEX_COLUMNS_ALL */
+ "SELECT DISTINCT " CATALOG_NAME ", INDEX_SCHEMA, INDEX_NAME, " CATALOG_NAME ", TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COLUMN_NAME, SEQ_IN_INDEX FROM INFORMATION_SCHEMA.STATISTICS WHERE INDEX_NAME <> 'PRIMARY' ORDER BY INDEX_SCHEMA, INDEX_NAME, SEQ_IN_INDEX",
+
+ /* I_STMT_INDEX_COLUMNS_NAMED */
+ "SELECT DISTINCT " CATALOG_NAME ", INDEX_SCHEMA, INDEX_NAME, " CATALOG_NAME ", TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COLUMN_NAME, SEQ_IN_INDEX FROM INFORMATION_SCHEMA.STATISTICS WHERE INDEX_NAME <> 'PRIMARY' AND TABLE_SCHEMA = BINARY ##schema::string AND TABLE_NAME = BINARY ##name::string AND INDEX_NAME = ##name2::string ORDER BY INDEX_SCHEMA, INDEX_NAME, SEQ_IN_INDEX"
};
/*
@@ -1585,7 +1606,7 @@ _gda_mysql_meta_routines (GdaServerProvider *prov,
if (!gda_holder_set_value (gda_set_get_holder (i_set, "schema"), routine_schema, error))
return FALSE;
if (routine_name_n != NULL) {
- if (!gda_holder_set_value (gda_set_get_holder (i_set, "name"), routine_name_n, error))
+ if (!gda_holder_set_value (gda_set_get_holder (i_set, "name"), routine_name_n, error))
return FALSE;
model = gda_connection_statement_execute_select (cnc, internal_stmt[I_STMT_ROUTINES_ONE], i_set, error);
} else
@@ -1656,8 +1677,35 @@ gboolean
_gda_mysql_meta__indexes_tab (GdaServerProvider *prov, GdaConnection *cnc,
GdaMetaStore *store, GdaMetaContext *context, GError **error)
{
- //TO_IMPLEMENT;
- return TRUE;
+ GdaDataModel *model;
+ gboolean retval;
+ MysqlConnectionData *cdata;
+ cdata = (MysqlConnectionData *) gda_connection_internal_get_provider_data (cnc);
+ if (!cdata)
+ return FALSE;
+
+ /* Check correct mysql server version. */
+ if (cdata->version_long < 50000) {
+ g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_SERVER_VERSION_ERROR,
+ "%s", _("Mysql version 5.0 at least is required"));
+ return FALSE;
+ }
+
+ model = gda_connection_statement_execute_select_full (cnc,
+ internal_stmt[I_STMT_INDEXES_ALL],
+ NULL,
+ GDA_STATEMENT_MODEL_RANDOM_ACCESS,
+ _col_types_table_indexes, error);
+ if (model == NULL)
+ retval = FALSE;
+ else {
+ gda_meta_store_set_reserved_keywords_func (store,
+ _gda_mysql_get_reserved_keyword_func (cdata));
+ retval = gda_meta_store_modify_with_context (store, context, model, error);
+ g_object_unref (G_OBJECT(model));
+ }
+
+ return retval;
}
gboolean
@@ -1666,16 +1714,83 @@ _gda_mysql_meta_indexes_tab (GdaServerProvider *prov, GdaConnection *cnc,
const GValue *table_catalog, const GValue *table_schema, const GValue *table_name,
const GValue *index_name_n)
{
- //TO_IMPLEMENT;
- return TRUE;
+ GdaDataModel *model;
+ gboolean retval;
+ /* Check correct mysql server version. */
+ MysqlConnectionData *cdata;
+ cdata = (MysqlConnectionData *) gda_connection_internal_get_provider_data (cnc);
+ if (!cdata)
+ return FALSE;
+ if (cdata->version_long < 50000) {
+ g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_SERVER_VERSION_ERROR,
+ "%s", _("Mysql version 5.0 at least is required"));
+ return FALSE;
+ }
+
+ if (!gda_holder_set_value (gda_set_get_holder (i_set, "schema"), table_schema, error))
+ return FALSE;
+ if (!gda_holder_set_value (gda_set_get_holder (i_set, "name"), table_name, error))
+ return FALSE;
+ if (index_name_n) {
+ if (!gda_holder_set_value (gda_set_get_holder (i_set, "name2"), index_name_n, error))
+ return FALSE;
+ model = gda_connection_statement_execute_select_full (cnc,
+ internal_stmt[I_STMT_INDEXES_ONE],
+ i_set,
+ GDA_STATEMENT_MODEL_RANDOM_ACCESS,
+ _col_types_table_indexes, error);
+ }
+ model = gda_connection_statement_execute_select_full (cnc,
+ internal_stmt[I_STMT_INDEXES_TABLE],
+ i_set,
+ GDA_STATEMENT_MODEL_RANDOM_ACCESS,
+ _col_types_table_indexes, error);
+
+ if (model == NULL)
+ retval = FALSE;
+ else {
+ gda_meta_store_set_reserved_keywords_func (store,
+ _gda_mysql_get_reserved_keyword_func (cdata));
+ retval = gda_meta_store_modify_with_context (store, context, model, error);
+ g_object_unref (G_OBJECT(model));
+
+ }
+
+ return retval;
}
gboolean
_gda_mysql_meta__index_cols (GdaServerProvider *prov, GdaConnection *cnc,
GdaMetaStore *store, GdaMetaContext *context, GError **error)
{
- //TO_IMPLEMENT;
- return TRUE;
+ GdaDataModel *model;
+ gboolean retval;
+ MysqlConnectionData *cdata;
+ cdata = (MysqlConnectionData *) gda_connection_internal_get_provider_data (cnc);
+ if (!cdata)
+ return FALSE;
+ /* Check correct mysql server version. */
+ if (cdata->version_long < 50000) {
+ g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_SERVER_VERSION_ERROR,
+ "%s", _("Mysql version 5.0 at least is required"));
+ return FALSE;
+ }
+
+ model = gda_connection_statement_execute_select_full (cnc,
+ internal_stmt[I_STMT_INDEX_COLUMNS_ALL],
+ NULL,
+ GDA_STATEMENT_MODEL_RANDOM_ACCESS,
+ _col_types_index_column_usage, error);
+ if (model == NULL)
+ retval = FALSE;
+ else {
+ gda_meta_store_set_reserved_keywords_func (store,
+ _gda_mysql_get_reserved_keyword_func (cdata));
+ retval = gda_meta_store_modify_with_context (store, context, model, error);
+ g_object_unref (G_OBJECT(model));
+ }
+
+ return retval;
}
gboolean
@@ -1684,7 +1799,41 @@ _gda_mysql_meta_index_cols (GdaServerProvider *prov, GdaConnection *cnc,
const GValue *table_catalog, const GValue *table_schema,
const GValue *table_name, const GValue *index_name)
{
- //TO_IMPLEMENT;
- return TRUE;
+ GdaDataModel *model;
+ gboolean retval;
+ /* Check correct mysql server version. */
+ MysqlConnectionData *cdata;
+ cdata = (MysqlConnectionData *) gda_connection_internal_get_provider_data (cnc);
+ if (!cdata)
+ return FALSE;
+ if (cdata->version_long < 50000) {
+ g_set_error (error, GDA_SERVER_PROVIDER_ERROR, GDA_SERVER_PROVIDER_SERVER_VERSION_ERROR,
+ "%s", _("Mysql version 5.0 at least is required"));
+ return FALSE;
+ }
+
+ if (!gda_holder_set_value (gda_set_get_holder (i_set, "schema"), table_schema, error))
+ return FALSE;
+ if (!gda_holder_set_value (gda_set_get_holder (i_set, "name"), table_name, error))
+ return FALSE;
+ if (!gda_holder_set_value (gda_set_get_holder (i_set, "name2"), index_name, error))
+ return FALSE;
+ model = gda_connection_statement_execute_select_full (cnc,
+ internal_stmt[I_STMT_INDEX_COLUMNS_NAMED],
+ i_set,
+ GDA_STATEMENT_MODEL_RANDOM_ACCESS,
+ _col_types_index_column_usage, error);
+
+ if (model == NULL)
+ retval = FALSE;
+ else {
+ gda_meta_store_set_reserved_keywords_func (store,
+ _gda_mysql_get_reserved_keyword_func (cdata));
+ retval = gda_meta_store_modify_with_context (store, context, model, error);
+ g_object_unref (G_OBJECT(model));
+
+ }
+
+ return retval;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]