Index: Driver/Source/ISSchemaProvider.cs
===================================================================
--- Driver/Source/ISSchemaProvider.cs (revision 1297)
+++ Driver/Source/ISSchemaProvider.cs (working copy)
@@ -87,7 +87,7 @@
{
string[] keys = new string[1];
keys[0] = "SCHEMA_NAME";
- DataTable dt = Query("SCHEMATA", "", keys, restrictions);
+ DataTable dt = Query("INFORMATION_SCHEMA", "SCHEMATA", "", keys, restrictions);
dt.Columns[1].ColumnName = "database_name";
dt.TableName = "Databases";
return dt;
@@ -100,7 +100,7 @@
keys[1] = "TABLE_SCHEMA";
keys[2] = "TABLE_NAME";
keys[3] = "TABLE_TYPE";
- DataTable dt = Query("TABLES", "TABLE_TYPE != 'VIEW'", keys, restrictions);
+ DataTable dt = Query("INFORMATION_SCHEMA", "TABLES", "TABLE_TYPE != 'VIEW'", keys, restrictions);
dt.TableName = "Tables";
return dt;
}
@@ -112,7 +112,7 @@
keys[1] = "TABLE_SCHEMA";
keys[2] = "TABLE_NAME";
keys[3] = "COLUMN_NAME";
- DataTable dt = Query("COLUMNS", null, keys, restrictions);
+ DataTable dt = Query("INFORMATION_SCHEMA", "COLUMNS", null, keys, restrictions);
dt.Columns.Remove("CHARACTER_OCTET_LENGTH");
dt.TableName = "Columns";
return dt;
@@ -124,7 +124,7 @@
keys[0] = "TABLE_CATALOG";
keys[1] = "TABLE_SCHEMA";
keys[2] = "TABLE_NAME";
- DataTable dt = Query("VIEWS", null, keys, restrictions);
+ DataTable dt = Query("INFORMATION_SCHEMA", "VIEWS", null, keys, restrictions);
dt.TableName = "Views";
return dt;
}
@@ -170,12 +170,39 @@
keys[1] = "TRIGGER_SCHEMA";
keys[2] = "EVENT_OBJECT_TABLE";
keys[3] = "TRIGGER_NAME";
- DataTable dt = Query("TRIGGERS", null, keys, restrictions);
+ DataTable dt = Query("INFORMATION_SCHEMA", "TRIGGERS", null, keys, restrictions);
dt.TableName = "Triggers";
return dt;
}
///
+ /// Return column names from mysql.proc that
+ /// correspond to information_schema colulmns
+ ///
+ ///
+ ///
+ private string GetRoutineColName(string name)
+ {
+ if (connection.Settings.UseProcedureBodies)
+ {
+ switch (name)
+ {
+ case "ROUTINE_CATALOG":
+ return "NULL";
+ case "ROUTINE_SCHEMA":
+ return "db";
+ case "ROUTINE_NAME":
+ return "name";
+ case "ROUTINE_TYPE":
+ return "type";
+ default:
+ return name;
+ }
+ }
+ return name;
+ }
+
+ ///
/// Return schema information about procedures and functions
/// Restrictions supported are:
/// schema, name, type
@@ -185,12 +212,19 @@
private DataTable GetProcedures(string[] restrictions)
{
string[] keys = new string[4];
+ string schema = "INFORMATION_SCHEMA";
+ string table = "ROUTINES";
+ if (connection.Settings.UseProcedureBodies)
+ {
+ schema = "mysql";
+ table = "proc";
+ }
keys[0] = "ROUTINE_CATALOG";
keys[1] = "ROUTINE_SCHEMA";
keys[2] = "ROUTINE_NAME";
keys[3] = "ROUTINE_TYPE";
- DataTable dt = Query("ROUTINES", null, keys, restrictions);
+ DataTable dt = Query(schema, table, null, keys, restrictions);
dt.TableName = "Procedures";
return dt;
}
@@ -303,11 +337,16 @@
return null;
}
- private DataTable Query(string table_name, string initial_where,
+ private DataTable Query(string schema, string table_name, string initial_where,
string[] keys, string[] values)
{
StringBuilder where = new StringBuilder(initial_where);
- StringBuilder query = new StringBuilder("SELECT * FROM INFORMATION_SCHEMA.");
+
+ string field_list = "";
+ if (schema.Equals("mysql"))
+ field_list = ", specific_name as SPECIFIC_NAME, NULL as ROUTINE_CATALOG, db as ROUTINE_SCHEMA, name as ROUTINE_NAME, type as ROUTINE_TYPE, sql_mode as SQL_MODE ";
+
+ StringBuilder query = new StringBuilder("SELECT * " + field_list + " FROM " + schema + ".");
query.Append(table_name);
if (values != null)
@@ -317,7 +356,7 @@
if (values[i] == null || values[i] == String.Empty) continue;
if (where.Length > 0)
where.Append(" AND ");
- where.AppendFormat(CultureInfo.InvariantCulture, "{0}='{1}'", keys[i], values[i]);
+ where.AppendFormat(CultureInfo.InvariantCulture, "{0}='{1}'", GetRoutineColName(keys[i]), values[i]);
}
if (where.Length > 0)