private static string GetDataTypeDefaults(string type, MySqlSchemaRow row) { string format = "({0},{1})"; object arg_11_0 = row["NUMERIC_PRECISION"]; if (MetaData.IsNumericType(type) && string.IsNullOrEmpty((string)row["NUMERIC_PRECISION"])) { row["NUMERIC_PRECISION"] = 10; row["NUMERIC_SCALE"] = 0; if (!MetaData.SupportScale(type)) { format = "({0})"; } return(string.Format(format, row["NUMERIC_PRECISION"], row["NUMERIC_SCALE"])); } return(string.Empty); }
private string GetProcedureParameterLine(MySqlSchemaRow isRow) { string text = "SHOW CREATE {0} `{1}`.`{2}`"; text = string.Format(text, isRow["ROUTINE_TYPE"], isRow["ROUTINE_SCHEMA"], isRow["ROUTINE_NAME"]); MySqlCommand mySqlCommand = new MySqlCommand(text, this.connection); string result; using (MySqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader()) { mySqlDataReader.Read(); if (mySqlDataReader.IsDBNull(2)) { result = null; } else { string @string = mySqlDataReader.GetString(1); string string2 = mySqlDataReader.GetString(2); MySqlTokenizer mySqlTokenizer = new MySqlTokenizer(string2); mySqlTokenizer.AnsiQuotes = (@string.IndexOf("ANSI_QUOTES") != -1); mySqlTokenizer.BackslashEscapes = (@string.IndexOf("NO_BACKSLASH_ESCAPES") == -1); string a = mySqlTokenizer.NextToken(); while (a != "(") { a = mySqlTokenizer.NextToken(); } int num = mySqlTokenizer.StartIndex + 1; a = mySqlTokenizer.NextToken(); while (a != ")" || mySqlTokenizer.Quoted) { a = mySqlTokenizer.NextToken(); if (a == "(" && !mySqlTokenizer.Quoted) { while (a != ")" || mySqlTokenizer.Quoted) { a = mySqlTokenizer.NextToken(); } a = mySqlTokenizer.NextToken(); } } result = string2.Substring(num, mySqlTokenizer.StartIndex - num); } } return(result); }
private void LoadTableColumns(MySqlSchemaCollection schemaCollection, string schema, string tableName, string columnRestriction) { string sql = String.Format("SHOW FULL COLUMNS FROM `{0}`.`{1}`", schema, tableName); MySqlCommand cmd = new MySqlCommand(sql, connection); int pos = 1; using (MySqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { string colName = reader.GetString(0); if (columnRestriction != null && colName != columnRestriction) { continue; } MySqlSchemaRow row = schemaCollection.AddRow(); row["TABLE_CATALOG"] = DBNull.Value; row["TABLE_SCHEMA"] = schema; row["TABLE_NAME"] = tableName; row["COLUMN_NAME"] = colName; row["ORDINAL_POSITION"] = pos++; row["COLUMN_DEFAULT"] = reader.GetValue(5); row["IS_NULLABLE"] = reader.GetString(3); row["DATA_TYPE"] = reader.GetString(1); row["CHARACTER_MAXIMUM_LENGTH"] = DBNull.Value; row["CHARACTER_OCTET_LENGTH"] = DBNull.Value; row["NUMERIC_PRECISION"] = DBNull.Value; row["NUMERIC_SCALE"] = DBNull.Value; row["CHARACTER_SET_NAME"] = reader.GetValue(2); row["COLLATION_NAME"] = row["CHARACTER_SET_NAME"]; row["COLUMN_TYPE"] = reader.GetString(1); row["COLUMN_KEY"] = reader.GetString(4); row["EXTRA"] = reader.GetString(6); row["PRIVILEGES"] = reader.GetString(7); row["COLUMN_COMMENT"] = reader.GetString(8); #if !CF && !RT row["GENERATION_EXPRESION"] = reader.GetString(6).Contains("VIRTUAL") ? reader.GetString(9) : string.Empty; #endif ParseColumnRow(row); } } }
private MySqlSchemaCollection GetDataSourceInformation() { MySqlSchemaCollection schemas = new MySqlSchemaCollection("DataSourceInformation"); schemas.AddColumn("CompositeIdentifierSeparatorPattern", typeof(string)); schemas.AddColumn("DataSourceProductName", typeof(string)); schemas.AddColumn("DataSourceProductVersion", typeof(string)); schemas.AddColumn("DataSourceProductVersionNormalized", typeof(string)); schemas.AddColumn("GroupByBehavior", typeof(GroupByBehavior)); schemas.AddColumn("IdentifierPattern", typeof(string)); schemas.AddColumn("IdentifierCase", typeof(IdentifierCase)); schemas.AddColumn("OrderByColumnsInSelect", typeof(bool)); schemas.AddColumn("ParameterMarkerFormat", typeof(string)); schemas.AddColumn("ParameterMarkerPattern", typeof(string)); schemas.AddColumn("ParameterNameMaxLength", typeof(int)); schemas.AddColumn("ParameterNamePattern", typeof(string)); schemas.AddColumn("QuotedIdentifierPattern", typeof(string)); schemas.AddColumn("QuotedIdentifierCase", typeof(IdentifierCase)); schemas.AddColumn("StatementSeparatorPattern", typeof(string)); schemas.AddColumn("StringLiteralPattern", typeof(string)); schemas.AddColumn("SupportedJoinOperators", typeof(SupportedJoinOperators)); DBVersion version = this.connection.driver.Version; string str = string.Format("{0:0}.{1:0}.{2:0}", version.Major, version.Minor, version.Build); MySqlSchemaRow item = schemas.AddRow(); item["CompositeIdentifierSeparatorPattern"] = @"\."; item["DataSourceProductName"] = "MySQL"; item["DataSourceProductVersion"] = this.connection.ServerVersion; item["DataSourceProductVersionNormalized"] = str; item["GroupByBehavior"] = GroupByBehavior.Unrelated; item["IdentifierPattern"] = "(^\\`\\p{Lo}\\p{Lu}\\p{Ll}_@#][\\p{Lo}\\p{Lu}\\p{Ll}\\p{Nd}@$#_]*$)|(^\\`[^\\`\\0]|\\`\\`+\\`$)|(^\\\" + [^\\\"\\0]|\\\"\\\"+\\\"$)"; item["IdentifierCase"] = IdentifierCase.Insensitive; item["OrderByColumnsInSelect"] = false; item["ParameterMarkerFormat"] = "{0}"; item["ParameterMarkerPattern"] = "(@[A-Za-z0-9_$#]*)"; item["ParameterNameMaxLength"] = 0x80; item["ParameterNamePattern"] = @"^[\p{Lo}\p{Lu}\p{Ll}\p{Lm}_@#][\p{Lo}\p{Lu}\p{Ll}\p{Lm}\p{Nd}\uff3f_@#\$]*(?=\s+|$)"; item["QuotedIdentifierPattern"] = @"(([^\`]|\`\`)*)"; item["QuotedIdentifierCase"] = IdentifierCase.Sensitive; item["StatementSeparatorPattern"] = ";"; item["StringLiteralPattern"] = "'(([^']|'')*)'"; item["SupportedJoinOperators"] = 15; schemas.Rows.Add(item); return(schemas); }
private static ParameterDirection GetDirection(MySqlSchemaRow row) { string a = row["PARAMETER_MODE"].ToString(); if (Convert.ToInt32(row["ORDINAL_POSITION"]) == 0) { return(ParameterDirection.ReturnValue); } if (a == "IN") { return(ParameterDirection.Input); } if (a == "OUT") { return(ParameterDirection.Output); } return(ParameterDirection.InputOutput); }
public virtual MySqlSchemaCollection GetUDF(string[] restrictions) { string sql = "SELECT name,ret,dl FROM mysql.func"; if (restrictions != null) { if (restrictions.Length >= 1 && !String.IsNullOrEmpty(restrictions[0])) { sql += String.Format(" WHERE name LIKE '{0}'", restrictions[0]); } } MySqlSchemaCollection dt = new MySqlSchemaCollection("User-defined Functions"); dt.AddColumn("NAME", typeof(string)); dt.AddColumn("RETURN_TYPE", typeof(int)); dt.AddColumn("LIBRARY_NAME", typeof(string)); MySqlCommand cmd = new MySqlCommand(sql, connection); try { using (MySqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { MySqlSchemaRow row = dt.AddRow(); row[0] = reader.GetString(0); row[1] = reader.GetInt32(1); row[2] = reader.GetString(2); } } } catch (MySqlException ex) { if (ex.Number != (int)MySqlErrorCode.TableAccessDenied) { throw; } throw new MySqlException(Resources.UnableToEnumerateUDF, ex); } return(dt); }
public virtual MySqlSchemaCollection GetIndexColumns(string[] restrictions) { MySqlSchemaCollection schemas = new MySqlSchemaCollection("IndexColumns"); schemas.AddColumn("INDEX_CATALOG", typeof(string)); schemas.AddColumn("INDEX_SCHEMA", typeof(string)); schemas.AddColumn("INDEX_NAME", typeof(string)); schemas.AddColumn("TABLE_NAME", typeof(string)); schemas.AddColumn("COLUMN_NAME", typeof(string)); schemas.AddColumn("ORDINAL_POSITION", typeof(int)); schemas.AddColumn("SORT_ORDER", typeof(string)); int num = (restrictions == null) ? 4 : restrictions.Length; string[] array = new string[Math.Max(num, 4)]; if (restrictions != null) { restrictions.CopyTo(array, 0); } array[3] = "BASE TABLE"; foreach (MySqlSchemaRow row in this.GetTables(array).Rows) { MySqlCommand command = new MySqlCommand(string.Format("SHOW INDEX FROM `{0}`.`{1}`", row["TABLE_SCHEMA"], row["TABLE_NAME"]), this.connection); using (MySqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { string str2 = GetString(reader, reader.GetOrdinal("KEY_NAME")); string str3 = GetString(reader, reader.GetOrdinal("COLUMN_NAME")); if ((restrictions == null) || ((((restrictions.Length < 4) || (restrictions[3] == null)) || (str2 == restrictions[3])) && (((restrictions.Length < 5) || (restrictions[4] == null)) || (str3 == restrictions[4])))) { MySqlSchemaRow row2 = schemas.AddRow(); row2["INDEX_CATALOG"] = null; row2["INDEX_SCHEMA"] = row["TABLE_SCHEMA"]; row2["INDEX_NAME"] = str2; row2["TABLE_NAME"] = GetString(reader, reader.GetOrdinal("TABLE")); row2["COLUMN_NAME"] = str3; row2["ORDINAL_POSITION"] = reader.GetValue(reader.GetOrdinal("SEQ_IN_INDEX")); row2["SORT_ORDER"] = reader.GetString("COLLATION"); } } } } return(schemas); }
private static ParameterDirection GetDirection(MySqlSchemaRow row) { string mode = row["PARAMETER_MODE"].ToString(); int ordinal = Convert.ToInt32(row["ORDINAL_POSITION"]); if (0 == ordinal) { return(ParameterDirection.ReturnValue); } else if (mode == "IN") { return(ParameterDirection.Input); } else if (mode == "OUT") { return(ParameterDirection.Output); } return(ParameterDirection.InputOutput); }
private void FindTables(MySqlSchemaCollection schema, string[] restrictions) { StringBuilder builder = new StringBuilder(); StringBuilder builder2 = new StringBuilder(); builder.AppendFormat(CultureInfo.InvariantCulture, "SHOW TABLE STATUS FROM `{0}`", new object[] { restrictions[1] }); if (((restrictions != null) && (restrictions.Length >= 3)) && (restrictions[2] != null)) { builder2.AppendFormat(CultureInfo.InvariantCulture, " LIKE '{0}'", new object[] { restrictions[2] }); } builder.Append(builder2.ToString()); string str = (restrictions[1].ToLower() == "information_schema") ? "SYSTEM VIEW" : "BASE TABLE"; MySqlCommand command = new MySqlCommand(builder.ToString(), this.connection); using (MySqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { MySqlSchemaRow row = schema.AddRow(); row["TABLE_CATALOG"] = null; row["TABLE_SCHEMA"] = restrictions[1]; row["TABLE_NAME"] = reader.GetString(0); row["TABLE_TYPE"] = str; row["ENGINE"] = GetString(reader, 1); row["VERSION"] = reader.GetValue(2); row["ROW_FORMAT"] = GetString(reader, 3); row["TABLE_ROWS"] = reader.GetValue(4); row["AVG_ROW_LENGTH"] = reader.GetValue(5); row["DATA_LENGTH"] = reader.GetValue(6); row["MAX_DATA_LENGTH"] = reader.GetValue(7); row["INDEX_LENGTH"] = reader.GetValue(8); row["DATA_FREE"] = reader.GetValue(9); row["AUTO_INCREMENT"] = reader.GetValue(10); row["CREATE_TIME"] = reader.GetValue(11); row["UPDATE_TIME"] = reader.GetValue(12); row["CHECK_TIME"] = reader.GetValue(13); row["TABLE_COLLATION"] = GetString(reader, 14); row["CHECKSUM"] = reader.GetValue(15); row["CREATE_OPTIONS"] = GetString(reader, 0x10); row["TABLE_COMMENT"] = GetString(reader, 0x11); } } }
private static void ParseDataTypeSize(MySqlSchemaRow row, string size) { size = size.Trim('(', ')'); string[] parts = size.Split(','); if (!MetaData.IsNumericType(row["DATA_TYPE"].ToString())) { row["CHARACTER_MAXIMUM_LENGTH"] = Int32.Parse(parts[0]); // will set octet length in a minute } else { row["NUMERIC_PRECISION"] = Int32.Parse(parts[0]); if (parts.Length == 2) { row["NUMERIC_SCALE"] = Int32.Parse(parts[1]); } } }
/// <summary> /// GetForeignKeysOnTable retrieves the foreign keys on the given table. /// Since MySQL supports foreign keys on versions prior to 5.0, we can't use /// information schema. MySQL also does not include any type of SHOW command /// for foreign keys so we have to resort to use SHOW CREATE TABLE and parsing /// the output. /// </summary> /// <param name="fkTable">The table to store the key info in.</param> /// <param name="tableToParse">The table to get the foeign key info for.</param> /// <param name="filterName">Only get foreign keys that match this name.</param> /// <param name="includeColumns">Should column information be included in the table.</param> private void GetForeignKeysOnTable(MySqlSchemaCollection fkTable, MySqlSchemaRow tableToParse, string filterName, bool includeColumns) { string sqlMode = GetSqlMode(); if (filterName != null) { filterName = StringUtility.ToLowerInvariant(filterName); } string sql = string.Format("SHOW CREATE TABLE `{0}`.`{1}`", tableToParse["TABLE_SCHEMA"], tableToParse["TABLE_NAME"]); string lowerBody = null, body = null; MySqlCommand cmd = new MySqlCommand(sql, connection); using (MySqlDataReader reader = cmd.ExecuteReader()) { reader.Read(); body = reader.GetString(1); lowerBody = StringUtility.ToLowerInvariant(body); } MySqlTokenizer tokenizer = new MySqlTokenizer(lowerBody); tokenizer.AnsiQuotes = sqlMode.IndexOf("ANSI_QUOTES") != -1; tokenizer.BackslashEscapes = sqlMode.IndexOf("NO_BACKSLASH_ESCAPES") != -1; while (true) { string token = tokenizer.NextToken(); // look for a starting contraint while (token != null && (token != "constraint" || tokenizer.Quoted)) { token = tokenizer.NextToken(); } if (token == null) { break; } ParseConstraint(fkTable, tableToParse, tokenizer, includeColumns); } }
public virtual MySqlSchemaCollection GetIndexes(string[] restrictions) { MySqlSchemaCollection schemas = new MySqlSchemaCollection("Indexes"); schemas.AddColumn("INDEX_CATALOG", typeof(string)); schemas.AddColumn("INDEX_SCHEMA", typeof(string)); schemas.AddColumn("INDEX_NAME", typeof(string)); schemas.AddColumn("TABLE_NAME", typeof(string)); schemas.AddColumn("UNIQUE", typeof(bool)); schemas.AddColumn("PRIMARY", typeof(bool)); schemas.AddColumn("TYPE", typeof(string)); schemas.AddColumn("COMMENT", typeof(string)); int num = (restrictions == null) ? 4 : restrictions.Length; string[] array = new string[Math.Max(num, 4)]; if (restrictions != null) { restrictions.CopyTo(array, 0); } array[3] = "BASE TABLE"; foreach (MySqlSchemaRow row in this.GetTables(array).Rows) { string sql = string.Format("SHOW INDEX FROM `{0}`.`{1}`", MySqlHelper.DoubleQuoteString((string)row["TABLE_SCHEMA"]), MySqlHelper.DoubleQuoteString((string)row["TABLE_NAME"])); foreach (MySqlSchemaRow row2 in this.QueryCollection("indexes", sql).Rows) { long num2 = (long)row2["SEQ_IN_INDEX"]; if ((num2 == 1L) && (((restrictions == null) || (restrictions.Length != 4)) || ((restrictions[3] == null) || row2["KEY_NAME"].Equals(restrictions[3])))) { MySqlSchemaRow row3 = schemas.AddRow(); row3["INDEX_CATALOG"] = null; row3["INDEX_SCHEMA"] = row["TABLE_SCHEMA"]; row3["INDEX_NAME"] = row2["KEY_NAME"]; row3["TABLE_NAME"] = row2["TABLE"]; row3["UNIQUE"] = ((long)row2["NON_UNIQUE"]) == 0L; row3["PRIMARY"] = row2["KEY_NAME"].Equals("PRIMARY"); row3["TYPE"] = row2["INDEX_TYPE"]; row3["COMMENT"] = row2["COMMENT"]; } } } return(schemas); }
private static MySqlSchemaCollection GetReservedWords() { MySqlSchemaCollection dt = new MySqlSchemaCollection("ReservedWords"); dt.AddColumn("ReservedWord", typeof(string)); Stream str = typeof(SchemaProvider).GetTypeInfo().Assembly.GetManifestResourceStream("MySql.Data.Properties.ReservedWords.txt"); StreamReader sr = new StreamReader(str); string line = sr.ReadLine(); while (line != null) { MySqlSchemaRow row = dt.AddRow(); row[0] = line; line = sr.ReadLine(); } sr.Dispose(); return(dt); }
private string GetProcedureParameterLine(MySqlSchemaRow isRow) { string sql = "SHOW CREATE {0} `{1}`.`{2}`"; sql = String.Format(sql, isRow["ROUTINE_TYPE"], isRow["ROUTINE_SCHEMA"], isRow["ROUTINE_NAME"]); MySqlCommand cmd = new MySqlCommand(sql, connection); using (MySqlDataReader reader = cmd.ExecuteReader()) { reader.Read(); // if we are not the owner of this proc or have permissions // then we will get null for the body if (reader.IsDBNull(2)) return null; string sql_mode = reader.GetString(1); string body = reader.GetString(2); MySqlTokenizer tokenizer = new MySqlTokenizer(body); tokenizer.AnsiQuotes = sql_mode.IndexOf("ANSI_QUOTES") != -1; tokenizer.BackslashEscapes = sql_mode.IndexOf("NO_BACKSLASH_ESCAPES") == -1; string token = tokenizer.NextToken(); while (token != "(") token = tokenizer.NextToken(); int start = tokenizer.StartIndex + 1; token = tokenizer.NextToken(); while (token != ")" || tokenizer.Quoted) { token = tokenizer.NextToken(); // if we see another ( and we are not quoted then we // are in a size element and we need to look for the closing paren if (token == "(" && !tokenizer.Quoted) { while (token != ")" || tokenizer.Quoted) token = tokenizer.NextToken(); token = tokenizer.NextToken(); } } return body.Substring(start, tokenizer.StartIndex - start); } }
private static MySqlSchemaCollection GetReservedWords() { MySqlSchemaCollection dt = new MySqlSchemaCollection("ReservedWords"); #if !RT && !DNXCORE50 dt.AddColumn(DbMetaDataColumnNames.ReservedWord, typeof(string)); Stream str = Assembly.GetExecutingAssembly().GetManifestResourceStream( "MySql.Data.MySqlClient.Properties.ReservedWords.txt"); #else dt.AddColumn("ReservedWord", typeof(string)); Stream str = typeof(SchemaProvider).GetTypeInfo().Assembly.GetManifestResourceStream("MySql.Data.MySqlClient.Properties.ReservedWords.txt"); #endif StreamReader sr = new StreamReader(str); string line = sr.ReadLine(); while (line != null) { string[] keywords = line.Split(new char[] { ' ' }); foreach (string s in keywords) { if (String.IsNullOrEmpty(s)) { continue; } MySqlSchemaRow row = dt.AddRow(); row[0] = s; } line = sr.ReadLine(); } #if !CF sr.Dispose(); #else sr.Close(); #endif #if !DNXCORE50 str.Close(); #else str.Dispose(); #endif return(dt); }
private MySqlSchemaCollection GetTable(string sql) { MySqlSchemaCollection c = new MySqlSchemaCollection(); MySqlCommand cmd = new MySqlCommand(sql, connection); MySqlDataReader reader = cmd.ExecuteReader(); // add columns for (int i = 0; i < reader.FieldCount; i++) c.AddColumn(reader.GetName(i), reader.GetFieldType(i)); using (reader) { while (reader.Read()) { MySqlSchemaRow row = c.AddRow(); for (int i = 0; i < reader.FieldCount; i++) row[i] = reader.GetValue(i); } } return c; }
public MySqlSchemaCollection(DataTable dt) : this() { // cache the original datatable to avoid the overhead of creating again whenever possible. _table = dt; int i = 0; foreach (DataColumn dc in dt.Columns) { columns.Add(new SchemaColumn() { Name = dc.ColumnName, Type = dc.DataType }); Mapping.Add(dc.ColumnName, i++); } foreach (DataRow dr in dt.Rows) { MySqlSchemaRow row = new MySqlSchemaRow(this); for (i = 0; i < columns.Count; i++) { row[i] = dr[i]; } rows.Add(row); } }
public virtual MySqlSchemaCollection GetDatabases(string[] restrictions) { Regex regex = null; int caseSetting = Int32.Parse(connection.driver.Property("lower_case_table_names")); string sql = "SHOW DATABASES"; // if lower_case_table_names is zero, then case lookup should be sensitive // so we can use LIKE to do the matching. if (caseSetting == 0) { if (restrictions != null && restrictions.Length >= 1) { sql = sql + " LIKE '" + restrictions[0] + "'"; } } MySqlSchemaCollection c = QueryCollection("Databases", sql); if (caseSetting != 0 && restrictions != null && restrictions.Length >= 1 && restrictions[0] != null) { regex = new Regex(restrictions[0], RegexOptions.IgnoreCase); } MySqlSchemaCollection c2 = new MySqlSchemaCollection("Databases"); c2.AddColumn("CATALOG_NAME", typeof(string)); c2.AddColumn("SCHEMA_NAME", typeof(string)); foreach (MySqlSchemaRow row in c.Rows) { if (regex != null && !regex.Match(row[0].ToString()).Success) { continue; } MySqlSchemaRow newRow = c2.AddRow(); newRow[1] = row[0]; } return(c2); }
private MySqlSchemaCollection GetTable(string sql) { MySqlSchemaCollection mySqlSchemaCollection = new MySqlSchemaCollection(); MySqlDataReader mySqlDataReader = new MySqlCommand(sql, this.connection).ExecuteReader(); for (int i = 0; i < mySqlDataReader.FieldCount; i++) { mySqlSchemaCollection.AddColumn(mySqlDataReader.GetName(i), mySqlDataReader.GetFieldType(i)); } using (mySqlDataReader) { while (mySqlDataReader.Read()) { MySqlSchemaRow mySqlSchemaRow = mySqlSchemaCollection.AddRow(); for (int j = 0; j < mySqlDataReader.FieldCount; j++) { mySqlSchemaRow[j] = mySqlDataReader.GetValue(j); } } } return(mySqlSchemaCollection); }
protected MySqlSchemaCollection QueryCollection(string name, string sql) { MySqlSchemaCollection schemas = new MySqlSchemaCollection(name); MySqlDataReader reader = new MySqlCommand(sql, this.connection).ExecuteReader(); for (int i = 0; i < reader.FieldCount; i++) { schemas.AddColumn(reader.GetName(i), reader.GetFieldType(i)); } using (reader) { while (reader.Read()) { MySqlSchemaRow row = schemas.AddRow(); for (int j = 0; j < reader.FieldCount; j++) { row[j] = reader.GetValue(j); } } } return(schemas); }
private static void ParseDataTypeSize(MySqlSchemaRow row, string size) { size = size.Trim(new char[] { '(', ')' }); string[] array = size.Split(new char[] { ',' }); if (!MetaData.IsNumericType(row["DATA_TYPE"].ToString())) { row["CHARACTER_MAXIMUM_LENGTH"] = int.Parse(array[0]); return; } row["NUMERIC_PRECISION"] = int.Parse(array[0]); if (array.Length == 2) { row["NUMERIC_SCALE"] = int.Parse(array[1]); } }
private static void ParseColumnRow(MySqlSchemaRow row) { string str = row["CHARACTER_SET_NAME"].ToString(); int index = str.IndexOf('_'); if (index != -1) { row["CHARACTER_SET_NAME"] = str.Substring(0, index); } string str2 = row["DATA_TYPE"].ToString(); index = str2.IndexOf('('); if (index != -1) { row["DATA_TYPE"] = str2.Substring(0, index); int num2 = str2.IndexOf(')', index); string str3 = str2.Substring(index + 1, num2 - (index + 1)); switch (row["DATA_TYPE"].ToString().ToLower()) { case "char": case "varchar": row["CHARACTER_MAXIMUM_LENGTH"] = str3; return; case "real": case "decimal": { string[] strArray = str3.Split(new char[] { ',' }); row["NUMERIC_PRECISION"] = strArray[0]; if (strArray.Length == 2) { row["NUMERIC_SCALE"] = strArray[1]; } break; } } } }
public virtual MySqlSchemaCollection GetUDF(string[] restrictions) { string cmdText = "SELECT name,ret,dl FROM mysql.func"; if (((restrictions != null) && (restrictions.Length >= 1)) && !string.IsNullOrEmpty(restrictions[0])) { cmdText = cmdText + string.Format(" WHERE name LIKE '{0}'", restrictions[0]); } MySqlSchemaCollection schemas = new MySqlSchemaCollection("User-defined Functions"); schemas.AddColumn("NAME", typeof(string)); schemas.AddColumn("RETURN_TYPE", typeof(int)); schemas.AddColumn("LIBRARY_NAME", typeof(string)); MySqlCommand command = new MySqlCommand(cmdText, this.connection); try { using (MySqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { MySqlSchemaRow row = schemas.AddRow(); row[0] = reader.GetString(0); row[1] = reader.GetInt32(1); row[2] = reader.GetString(2); } } } catch (MySqlException exception) { if (exception.Number != 0x476) { throw; } throw new MySqlException(Resources.UnableToEnumerateUDF, exception); } return(schemas); }
private static void ParseColumnRow(MySqlSchemaRow row) { // first parse the character set name string charset = row["CHARACTER_SET_NAME"].ToString(); int index = charset.IndexOf('_'); if (index != -1) { row["CHARACTER_SET_NAME"] = charset.Substring(0, index); } // now parse the data type string dataType = row["DATA_TYPE"].ToString(); index = dataType.IndexOf('('); if (index == -1) { return; } row["DATA_TYPE"] = dataType.Substring(0, index); int stop = dataType.IndexOf(')', index); string dataLen = dataType.Substring(index + 1, stop - (index + 1)); string lowerType = row["DATA_TYPE"].ToString().ToLower(); if (lowerType == "char" || lowerType == "varchar") { row["CHARACTER_MAXIMUM_LENGTH"] = dataLen; } else if (lowerType == "real" || lowerType == "decimal") { string[] lenparts = dataLen.Split(new char[] { ',' }); row["NUMERIC_PRECISION"] = lenparts[0]; if (lenparts.Length == 2) { row["NUMERIC_SCALE"] = lenparts[1]; } } }
private MySqlParameter GetAndFixParameter(string spName, MySqlSchemaRow param, bool realAsFloat, MySqlParameter returnParameter) { string arg_10_0 = (string)param["PARAMETER_MODE"]; string parameterName = (string)param["PARAMETER_NAME"]; if (param["ORDINAL_POSITION"].Equals(0)) { if (returnParameter == null) { throw new InvalidOperationException(string.Format(Resources.RoutineRequiresReturnParameter, spName)); } parameterName = returnParameter.ParameterName; } MySqlParameter parameterFlexible = this.command.Parameters.GetParameterFlexible(parameterName, true); if (!parameterFlexible.TypeHasBeenSet) { string typeName = (string)param["DATA_TYPE"]; bool unsigned = StoredProcedure.GetFlags(param["DTD_IDENTIFIER"].ToString()).IndexOf("UNSIGNED") != -1; parameterFlexible.MySqlDbType = MetaData.NameToType(typeName, unsigned, realAsFloat, base.Connection); } return(parameterFlexible); }
private void GetForeignKeysOnTable(MySqlSchemaCollection fkTable, MySqlSchemaRow tableToParse, string filterName, bool includeColumns) { string sqlMode = this.GetSqlMode(); if (filterName != null) { filterName = StringUtility.ToLowerInvariant(filterName); } string cmdText = string.Format("SHOW CREATE TABLE `{0}`.`{1}`", tableToParse["TABLE_SCHEMA"], tableToParse["TABLE_NAME"]); string input = null; MySqlCommand command = new MySqlCommand(cmdText, this.connection); using (MySqlDataReader reader = command.ExecuteReader()) { reader.Read(); input = StringUtility.ToLowerInvariant(reader.GetString(1)); } MySqlTokenizer tokenizer = new MySqlTokenizer(input) { AnsiQuotes = sqlMode.IndexOf("ANSI_QUOTES") != -1, BackslashEscapes = sqlMode.IndexOf("NO_BACKSLASH_ESCAPES") != -1 }; while (true) { string str5 = tokenizer.NextToken(); while ((str5 != null) && ((str5 != "constraint") || tokenizer.Quoted)) { str5 = tokenizer.NextToken(); } if (str5 == null) { return; } ParseConstraint(fkTable, tableToParse, tokenizer, includeColumns); } }
private void LoadTableColumns(MySqlSchemaCollection schemaCollection, string schema, string tableName, string columnRestriction) { MySqlCommand command = new MySqlCommand(string.Format("SHOW FULL COLUMNS FROM `{0}`.`{1}`", schema, tableName), this.connection); int num = 1; using (MySqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { string str2 = reader.GetString(0); if ((columnRestriction == null) || (str2 == columnRestriction)) { MySqlSchemaRow row = schemaCollection.AddRow(); row["TABLE_CATALOG"] = DBNull.Value; row["TABLE_SCHEMA"] = schema; row["TABLE_NAME"] = tableName; row["COLUMN_NAME"] = str2; row["ORDINAL_POSITION"] = num++; row["COLUMN_DEFAULT"] = reader.GetValue(5); row["IS_NULLABLE"] = reader.GetString(3); row["DATA_TYPE"] = reader.GetString(1); row["CHARACTER_MAXIMUM_LENGTH"] = DBNull.Value; row["CHARACTER_OCTET_LENGTH"] = DBNull.Value; row["NUMERIC_PRECISION"] = DBNull.Value; row["NUMERIC_SCALE"] = DBNull.Value; row["CHARACTER_SET_NAME"] = reader.GetValue(2); row["COLLATION_NAME"] = row["CHARACTER_SET_NAME"]; row["COLUMN_TYPE"] = reader.GetString(1); row["COLUMN_KEY"] = reader.GetString(4); row["EXTRA"] = reader.GetString(6); row["PRIVILEGES"] = reader.GetString(7); row["COLUMN_COMMENT"] = reader.GetString(8); ParseColumnRow(row); } } } }
public MySqlSchemaCollection(DataTable dt) : this() { this._table = dt; int i = 0; foreach (DataColumn dataColumn in dt.Columns) { this.columns.Add(new SchemaColumn { Name = dataColumn.ColumnName, Type = dataColumn.DataType }); this.Mapping.Add(dataColumn.ColumnName, i++); } foreach (DataRow dataRow in dt.Rows) { MySqlSchemaRow mySqlSchemaRow = new MySqlSchemaRow(this); for (i = 0; i < this.columns.Count; i++) { mySqlSchemaRow[i] = dataRow[i]; } this.rows.Add(mySqlSchemaRow); } }
protected MySqlSchemaCollection QueryCollection(string name, string sql) { MySqlSchemaCollection c = new MySqlSchemaCollection(name); MySqlCommand cmd = new MySqlCommand(sql, connection); MySqlDataReader reader = cmd.ExecuteReader(); for (int i = 0; i < reader.FieldCount; i++) { c.AddColumn(reader.GetName(i), reader.GetFieldType(i)); } using (reader) { while (reader.Read()) { MySqlSchemaRow row = c.AddRow(); for (int i = 0; i < reader.FieldCount; i++) { row[i] = reader.GetValue(i); } } } return(c); }
internal MySqlSchemaRow AddRow() { MySqlSchemaRow r = new MySqlSchemaRow(this); rows.Add(r); return r; }
private static string GetDataTypeDefaults(string type, MySqlSchemaRow row) { string format = "({0},{1})"; object precision = row["NUMERIC_PRECISION"]; if (MetaData.IsNumericType(type) && string.IsNullOrEmpty((string)row["NUMERIC_PRECISION"])) { row["NUMERIC_PRECISION"] = 10; row["NUMERIC_SCALE"] = 0; if (!MetaData.SupportScale(type)) format = "({0})"; return String.Format(format, row["NUMERIC_PRECISION"], row["NUMERIC_SCALE"]); } return String.Empty; }
/// <summary> /// Initializes a new row for the procedure parameters table. /// </summary> private static void InitParameterRow(MySqlSchemaRow procedure, MySqlSchemaRow parameter) { parameter["SPECIFIC_CATALOG"] = null; parameter["SPECIFIC_SCHEMA"] = procedure["ROUTINE_SCHEMA"]; parameter["SPECIFIC_NAME"] = procedure["ROUTINE_NAME"]; parameter["PARAMETER_MODE"] = "IN"; parameter["ORDINAL_POSITION"] = 0; parameter["ROUTINE_TYPE"] = procedure["ROUTINE_TYPE"]; }
private static void ParseDataTypeSize(MySqlSchemaRow row, string size) { size = size.Trim('(', ')'); string[] parts = size.Split(','); if (!MetaData.IsNumericType(row["DATA_TYPE"].ToString())) { row["CHARACTER_MAXIMUM_LENGTH"] = Int32.Parse(parts[0]); // will set octet length in a minute } else { row["NUMERIC_PRECISION"] = Int32.Parse(parts[0]); if (parts.Length == 2) row["NUMERIC_SCALE"] = Int32.Parse(parts[1]); } }
private static void ParseConstraint(MySqlSchemaCollection fkTable, MySqlSchemaRow table, MySqlTokenizer tokenizer, bool includeColumns) { string name = tokenizer.NextToken(); MySqlSchemaRow row = fkTable.AddRow(); // make sure this constraint is a FK string token = tokenizer.NextToken(); if (token != "foreign" || tokenizer.Quoted) return; tokenizer.NextToken(); // read off the 'KEY' symbol tokenizer.NextToken(); // read off the '(' symbol row["CONSTRAINT_CATALOG"] = table["TABLE_CATALOG"]; row["CONSTRAINT_SCHEMA"] = table["TABLE_SCHEMA"]; row["TABLE_CATALOG"] = table["TABLE_CATALOG"]; row["TABLE_SCHEMA"] = table["TABLE_SCHEMA"]; row["TABLE_NAME"] = table["TABLE_NAME"]; row["REFERENCED_TABLE_CATALOG"] = null; row["CONSTRAINT_NAME"] = name.Trim(new char[] { '\'', '`' }); List<string> srcColumns = includeColumns ? ParseColumns(tokenizer) : null; // now look for the references section while (token != "references" || tokenizer.Quoted) token = tokenizer.NextToken(); string target1 = tokenizer.NextToken(); string target2 = tokenizer.NextToken(); if (target2.StartsWith(".", StringComparison.Ordinal)) { row["REFERENCED_TABLE_SCHEMA"] = target1; row["REFERENCED_TABLE_NAME"] = target2.Substring(1).Trim(new char[] { '\'', '`' }); tokenizer.NextToken(); // read off the '(' } else { row["REFERENCED_TABLE_SCHEMA"] = table["TABLE_SCHEMA"]; row["REFERENCED_TABLE_NAME"] = target1.Substring(1).Trim(new char[] { '\'', '`' }); ; } // if we are supposed to include columns, read the target columns List<string> targetColumns = includeColumns ? ParseColumns(tokenizer) : null; if (includeColumns) ProcessColumns(fkTable, row, srcColumns, targetColumns); else fkTable.Rows.Add(row); }
private static void ProcessColumns(MySqlSchemaCollection fkTable, MySqlSchemaRow row, List<string> srcColumns, List<string> targetColumns) { for (int i = 0; i < srcColumns.Count; i++) { MySqlSchemaRow newRow = fkTable.AddRow(); row.CopyRow(newRow); newRow["COLUMN_NAME"] = srcColumns[i]; newRow["ORDINAL_POSITION"] = i; newRow["REFERENCED_COLUMN_NAME"] = targetColumns[i]; fkTable.Rows.Add(newRow); } }
/// <summary> /// Parses out the elements of a procedure parameter data type. /// </summary> private string ParseDataType(MySqlSchemaRow row, MySqlTokenizer tokenizer) { StringBuilder dtd = new StringBuilder( tokenizer.NextToken().ToUpper()); row["DATA_TYPE"] = dtd.ToString(); string type = row["DATA_TYPE"].ToString(); string token = tokenizer.NextToken(); if (token == "(") { token = tokenizer.ReadParenthesis(); dtd.AppendFormat(CultureInfo.InvariantCulture, "{0}", token); if (type != "ENUM" && type != "SET") ParseDataTypeSize(row, token); token = tokenizer.NextToken(); } else dtd.Append(GetDataTypeDefaults(type, row)); while (token != ")" && token != "," && String.Compare(token, "begin", StringComparison.OrdinalIgnoreCase) != 0 && String.Compare(token, "return", StringComparison.OrdinalIgnoreCase) != 0) { if (String.Compare(token, "CHARACTER", StringComparison.OrdinalIgnoreCase) == 0 || String.Compare(token, "BINARY", StringComparison.OrdinalIgnoreCase) == 0) { } // we don't need to do anything with this else if (String.Compare(token, "SET", StringComparison.OrdinalIgnoreCase) == 0 || String.Compare(token, "CHARSET", StringComparison.OrdinalIgnoreCase) == 0) row["CHARACTER_SET_NAME"] = tokenizer.NextToken(); else if (String.Compare(token, "ASCII", StringComparison.OrdinalIgnoreCase) == 0) row["CHARACTER_SET_NAME"] = "latin1"; else if (String.Compare(token, "UNICODE", StringComparison.OrdinalIgnoreCase) == 0) row["CHARACTER_SET_NAME"] = "ucs2"; else if (String.Compare(token, "COLLATE", StringComparison.OrdinalIgnoreCase) == 0) row["COLLATION_NAME"] = tokenizer.NextToken(); else dtd.AppendFormat(CultureInfo.InvariantCulture, " {0}", token); token = tokenizer.NextToken(); } if (dtd.Length > 0) row["DTD_IDENTIFIER"] = dtd.ToString(); // now default the collation if one wasn't given if (string.IsNullOrEmpty((string)row["COLLATION_NAME"]) && !string.IsNullOrEmpty((string)row["CHARACTER_SET_NAME"])) row["COLLATION_NAME"] = CharSetMap.GetDefaultCollation( row["CHARACTER_SET_NAME"].ToString(), connection); // now set the octet length if (row["CHARACTER_MAXIMUM_LENGTH"] != null) { if (row["CHARACTER_SET_NAME"] == null) row["CHARACTER_SET_NAME"] = ""; row["CHARACTER_OCTET_LENGTH"] = CharSetMap.GetMaxLength((string)row["CHARACTER_SET_NAME"], connection) * (int)row["CHARACTER_MAXIMUM_LENGTH"]; } return token; }
private void ParseProcedureBody(MySqlSchemaCollection parametersTable, string body, MySqlSchemaRow row, string nameToRestrict) { List <string> modes = new List <string>(new string[3] { "IN", "OUT", "INOUT" }); string sqlMode = row["SQL_MODE"].ToString(); int pos = 1; MySqlTokenizer tokenizer = new MySqlTokenizer(body); tokenizer.AnsiQuotes = sqlMode.IndexOf("ANSI_QUOTES") != -1; tokenizer.BackslashEscapes = sqlMode.IndexOf("NO_BACKSLASH_ESCAPES") == -1; tokenizer.ReturnComments = false; string token = tokenizer.NextToken(); // this block will scan for the opening paren while also determining // if this routine is a function. If so, then we need to add a // parameter row for the return parameter since it is ordinal position // 0 and should appear first. while (token != "(") { if (String.Compare(token, "FUNCTION", StringComparison.OrdinalIgnoreCase) == 0 && nameToRestrict == null) { parametersTable.AddRow(); InitParameterRow(row, parametersTable.Rows[0]); } token = tokenizer.NextToken(); } token = tokenizer.NextToken(); // now move to the next token past the ( while (token != ")") { MySqlSchemaRow parmRow = parametersTable.NewRow(); InitParameterRow(row, parmRow); parmRow["ORDINAL_POSITION"] = pos++; // handle mode and name for the parameter string mode = StringUtility.ToUpperInvariant(token); if (!tokenizer.Quoted && modes.Contains(mode)) { parmRow["PARAMETER_MODE"] = mode; token = tokenizer.NextToken(); } if (tokenizer.Quoted) { token = token.Substring(1, token.Length - 2); } parmRow["PARAMETER_NAME"] = token; // now parse data type token = ParseDataType(parmRow, tokenizer); if (token == ",") { token = tokenizer.NextToken(); } // now determine if we should include this row after all // we need to parse it before this check so we are correctly // positioned for the next parameter if (nameToRestrict == null || String.Compare(parmRow["PARAMETER_NAME"].ToString(), nameToRestrict, StringComparison.OrdinalIgnoreCase) == 0) { parametersTable.Rows.Add(parmRow); } } // now parse out the return parameter if there is one. token = StringUtility.ToUpperInvariant(tokenizer.NextToken()); if (String.Compare(token, "RETURNS", StringComparison.OrdinalIgnoreCase) == 0) { MySqlSchemaRow parameterRow = parametersTable.Rows[0]; parameterRow["PARAMETER_NAME"] = "RETURN_VALUE"; ParseDataType(parameterRow, tokenizer); } }
private void ParseProcedureBody(MySqlSchemaCollection parametersTable, string body, MySqlSchemaRow row, string nameToRestrict) { List<string> modes = new List<string>(new string[3] { "IN", "OUT", "INOUT" }); string sqlMode = row["SQL_MODE"].ToString(); int pos = 1; MySqlTokenizer tokenizer = new MySqlTokenizer(body); tokenizer.AnsiQuotes = sqlMode.IndexOf("ANSI_QUOTES") != -1; tokenizer.BackslashEscapes = sqlMode.IndexOf("NO_BACKSLASH_ESCAPES") == -1; tokenizer.ReturnComments = false; string token = tokenizer.NextToken(); // this block will scan for the opening paren while also determining // if this routine is a function. If so, then we need to add a // parameter row for the return parameter since it is ordinal position // 0 and should appear first. while (token != "(") { if (String.Compare(token, "FUNCTION", StringComparison.OrdinalIgnoreCase) == 0 && nameToRestrict == null) { parametersTable.AddRow(); InitParameterRow(row, parametersTable.Rows[0]); } token = tokenizer.NextToken(); } token = tokenizer.NextToken(); // now move to the next token past the ( while (token != ")") { MySqlSchemaRow parmRow = parametersTable.NewRow(); InitParameterRow(row, parmRow); parmRow["ORDINAL_POSITION"] = pos++; // handle mode and name for the parameter string mode = token.ToUpper(); if (!tokenizer.Quoted && modes.Contains(mode)) { parmRow["PARAMETER_MODE"] = mode; token = tokenizer.NextToken(); } if (tokenizer.Quoted) token = token.Substring(1, token.Length - 2); parmRow["PARAMETER_NAME"] = token; // now parse data type token = ParseDataType(parmRow, tokenizer); if (token == ",") token = tokenizer.NextToken(); // now determine if we should include this row after all // we need to parse it before this check so we are correctly // positioned for the next parameter if (nameToRestrict == null || String.Compare(parmRow["PARAMETER_NAME"].ToString(), nameToRestrict, StringComparison.OrdinalIgnoreCase) == 0) parametersTable.Rows.Add(parmRow); } // now parse out the return parameter if there is one. token = tokenizer.NextToken().ToUpper(); if (String.Compare(token, "RETURNS", StringComparison.OrdinalIgnoreCase) == 0) { MySqlSchemaRow parameterRow = parametersTable.Rows[0]; parameterRow["PARAMETER_NAME"] = "RETURN_VALUE"; ParseDataType(parameterRow, tokenizer); } }
private MySqlParameter GetAndFixParameter(string spName, MySqlSchemaRow param, bool realAsFloat, MySqlParameter returnParameter) { string mode = (string)param["PARAMETER_MODE"]; string pName = (string)param["PARAMETER_NAME"]; if (param["ORDINAL_POSITION"].Equals(0)) { if (returnParameter == null) throw new InvalidOperationException( String.Format(Resources.RoutineRequiresReturnParameter, spName)); pName = returnParameter.ParameterName; } // make sure the parameters given to us have an appropriate type set if it's not already MySqlParameter p = command.Parameters.GetParameterFlexible(pName, true); if (!p.TypeHasBeenSet) { string datatype = (string)param["DATA_TYPE"]; bool unsigned = GetFlags(param["DTD_IDENTIFIER"].ToString()).IndexOf("UNSIGNED") != -1; p.MySqlDbType = MetaData.NameToType(datatype, unsigned, realAsFloat, Connection); } return p; }
private static ParameterDirection GetDirection(MySqlSchemaRow row) { string mode = row["PARAMETER_MODE"].ToString(); int ordinal = Convert.ToInt32(row["ORDINAL_POSITION"]); if (0 == ordinal) return ParameterDirection.ReturnValue; else if (mode == "IN") return ParameterDirection.Input; else if (mode == "OUT") return ParameterDirection.Output; return ParameterDirection.InputOutput; }
private static List<string> GetPossibleValues(MySqlSchemaRow row) { string[] types = new string[] { "ENUM", "SET" }; string dtdIdentifier = row["DTD_IDENTIFIER"].ToString().Trim(); int index = 0; for (; index < 2; index++) if (dtdIdentifier.StartsWith(types[index], StringComparison.OrdinalIgnoreCase )) break; if (index == 2) return null; dtdIdentifier = dtdIdentifier.Substring(types[index].Length).Trim(); dtdIdentifier = dtdIdentifier.Trim('(', ')').Trim(); List<string> values = new List<string>(); MySqlTokenizer tokenzier = new MySqlTokenizer(dtdIdentifier); string token = tokenzier.NextToken(); int start = tokenzier.StartIndex; while (true) { if (token == null || token == ",") { int end = dtdIdentifier.Length - 1; if (token == ",") end = tokenzier.StartIndex; string value = dtdIdentifier.Substring(start, end - start).Trim('\'', '\"').Trim(); values.Add(value); start = tokenzier.StopIndex; } if (token == null) break; token = tokenzier.NextToken(); } return values; }
private static void ParseColumnRow(MySqlSchemaRow row) { // first parse the character set name string charset = row["CHARACTER_SET_NAME"].ToString(); int index = charset.IndexOf('_'); if (index != -1) row["CHARACTER_SET_NAME"] = charset.Substring(0, index); // now parse the data type string dataType = row["DATA_TYPE"].ToString(); index = dataType.IndexOf('('); if (index == -1) return; row["DATA_TYPE"] = dataType.Substring(0, index); int stop = dataType.IndexOf(')', index); string dataLen = dataType.Substring(index + 1, stop - (index + 1)); string lowerType = row["DATA_TYPE"].ToString().ToLower(); if (lowerType == "char" || lowerType == "varchar") row["CHARACTER_MAXIMUM_LENGTH"] = dataLen; else if (lowerType == "real" || lowerType == "decimal") { string[] lenparts = dataLen.Split(new char[] { ',' }); row["NUMERIC_PRECISION"] = lenparts[0]; if (lenparts.Length == 2) row["NUMERIC_SCALE"] = lenparts[1]; } }
/// <summary> /// Parses out the elements of a procedure parameter data type. /// </summary> private string ParseDataType(MySqlSchemaRow row, MySqlTokenizer tokenizer) { StringBuilder dtd = new StringBuilder( StringUtility.ToUpperInvariant(tokenizer.NextToken())); row["DATA_TYPE"] = dtd.ToString(); string type = row["DATA_TYPE"].ToString(); string token = tokenizer.NextToken(); if (token == "(") { token = tokenizer.ReadParenthesis(); dtd.AppendFormat(CultureInfo.InvariantCulture, "{0}", token); if (type != "ENUM" && type != "SET") { ParseDataTypeSize(row, token); } token = tokenizer.NextToken(); } else { dtd.Append(GetDataTypeDefaults(type, row)); } while (token != ")" && token != "," && String.Compare(token, "begin", StringComparison.OrdinalIgnoreCase) != 0 && String.Compare(token, "return", StringComparison.OrdinalIgnoreCase) != 0) { if (String.Compare(token, "CHARACTER", StringComparison.OrdinalIgnoreCase) == 0 || String.Compare(token, "BINARY", StringComparison.OrdinalIgnoreCase) == 0) { } // we don't need to do anything with this else if (String.Compare(token, "SET", StringComparison.OrdinalIgnoreCase) == 0 || String.Compare(token, "CHARSET", StringComparison.OrdinalIgnoreCase) == 0) { row["CHARACTER_SET_NAME"] = tokenizer.NextToken(); } else if (String.Compare(token, "ASCII", StringComparison.OrdinalIgnoreCase) == 0) { row["CHARACTER_SET_NAME"] = "latin1"; } else if (String.Compare(token, "UNICODE", StringComparison.OrdinalIgnoreCase) == 0) { row["CHARACTER_SET_NAME"] = "ucs2"; } else if (String.Compare(token, "COLLATE", StringComparison.OrdinalIgnoreCase) == 0) { row["COLLATION_NAME"] = tokenizer.NextToken(); } else { dtd.AppendFormat(CultureInfo.InvariantCulture, " {0}", token); } token = tokenizer.NextToken(); } if (dtd.Length > 0) { row["DTD_IDENTIFIER"] = dtd.ToString(); } // now default the collation if one wasn't given if (string.IsNullOrEmpty(( string )row["COLLATION_NAME"]) && !string.IsNullOrEmpty(( string )row["CHARACTER_SET_NAME"])) { row["COLLATION_NAME"] = CharSetMap.GetDefaultCollation( row["CHARACTER_SET_NAME"].ToString(), connection); } // now set the octet length if (row["CHARACTER_MAXIMUM_LENGTH"] != null) { if (row["CHARACTER_SET_NAME"] == null) { row["CHARACTER_SET_NAME"] = ""; } row["CHARACTER_OCTET_LENGTH"] = CharSetMap.GetMaxLength(( string )row["CHARACTER_SET_NAME"], connection) * (int)row["CHARACTER_MAXIMUM_LENGTH"]; } return(token); }
internal MySqlSchemaRow NewRow() { MySqlSchemaRow r = new MySqlSchemaRow(this); return r; }
/// <summary> /// GetForeignKeysOnTable retrieves the foreign keys on the given table. /// Since MySQL supports foreign keys on versions prior to 5.0, we can't use /// information schema. MySQL also does not include any type of SHOW command /// for foreign keys so we have to resort to use SHOW CREATE TABLE and parsing /// the output. /// </summary> /// <param name="fkTable">The table to store the key info in.</param> /// <param name="tableToParse">The table to get the foeign key info for.</param> /// <param name="filterName">Only get foreign keys that match this name.</param> /// <param name="includeColumns">Should column information be included in the table.</param> private void GetForeignKeysOnTable(MySqlSchemaCollection fkTable, MySqlSchemaRow tableToParse, string filterName, bool includeColumns) { string sqlMode = GetSqlMode(); if (filterName != null) filterName = StringUtility.ToLowerInvariant(filterName); string sql = string.Format("SHOW CREATE TABLE `{0}`.`{1}`", tableToParse["TABLE_SCHEMA"], tableToParse["TABLE_NAME"]); string lowerBody = null, body = null; MySqlCommand cmd = new MySqlCommand(sql, connection); using (MySqlDataReader reader = cmd.ExecuteReader()) { reader.Read(); body = reader.GetString(1); lowerBody = StringUtility.ToLowerInvariant(body); } MySqlTokenizer tokenizer = new MySqlTokenizer(lowerBody); tokenizer.AnsiQuotes = sqlMode.IndexOf("ANSI_QUOTES") != -1; tokenizer.BackslashEscapes = sqlMode.IndexOf("NO_BACKSLASH_ESCAPES") != -1; while (true) { string token = tokenizer.NextToken(); // look for a starting contraint while (token != null && (token != "constraint" || tokenizer.Quoted)) token = tokenizer.NextToken(); if (token == null) break; ParseConstraint(fkTable, tableToParse, tokenizer, includeColumns); } }
internal void CopyRow(MySqlSchemaRow row) { if (Collection.Columns.Count != row.Collection.Columns.Count) throw new InvalidOperationException("column count doesn't match"); for (int i = 0; i < Collection.Columns.Count; i++) row[i] = this[i]; }