private void SetFieldEncoding() { Dictionary <int, string> charSets = driver.CharacterSets; DBVersion version = driver.Version; if (charSets == null || charSets.Count == 0 || CharacterSetIndex == -1) { return; } if (charSets[CharacterSetIndex] == null) { return; } CharacterSet cs = CharSetMap.GetCharacterSet(version, (string)charSets[CharacterSetIndex]); // starting with 6.0.4 utf8 has a maxlen of 4 instead of 3. The old // 3 byte utf8 is utf8mb3 if (StringUtility.ToLowerInvariant(cs.name) == "utf-8" && version.Major >= 6) { MaxLength = 4; } else { MaxLength = cs.byteCount; } Encoding = CharSetMap.GetEncoding(version, (string)charSets[CharacterSetIndex]); }
public MySqlConnectionStringOption(string keyword, string synonyms, Type baseType, object defaultValue, bool obsolete, MySqlConnectionStringOption.SetterDelegate setter = null, MySqlConnectionStringOption.GetterDelegate getter = null) { this.Keyword = StringUtility.ToLowerInvariant(keyword); if (synonyms != null) { this.Synonyms = StringUtility.ToLowerInvariant(synonyms).Split(new char[] { ',' }); } this.BaseType = baseType; this.Obsolete = obsolete; this.DefaultValue = defaultValue; MySqlConnectionStringOption.SetterDelegate arg_46_6; if ((arg_46_6 = MySqlConnectionStringOption.sealedClass.setterDelegate) == null) { arg_46_6 = (MySqlConnectionStringOption.sealedClass.setterDelegate = new MySqlConnectionStringOption.SetterDelegate(MySqlConnectionStringOption.sealedClass.instance.SetValue)); } MySqlConnectionStringOption.GetterDelegate arg_46_7; if ((arg_46_7 = MySqlConnectionStringOption.sealedClass.getterDelegate) == null) { arg_46_7 = (MySqlConnectionStringOption.sealedClass.getterDelegate = new MySqlConnectionStringOption.GetterDelegate(MySqlConnectionStringOption.sealedClass.instance.GetValue)); } this.Setter = arg_46_6; this.Getter = arg_46_7; }
internal string GetCommandTextForBatching() { if (this.batchableCommandText == null) { if (string.Compare(this.CommandText.Substring(0, 6), "INSERT", StringComparison.OrdinalIgnoreCase) == 0) { MySqlCommand mySqlCommand = new MySqlCommand("SELECT @@sql_mode", this.Connection); string text = StringUtility.ToUpperInvariant(mySqlCommand.ExecuteScalar().ToString()); MySqlTokenizer mySqlTokenizer = new MySqlTokenizer(this.CommandText); mySqlTokenizer.AnsiQuotes = (text.IndexOf("ANSI_QUOTES") != -1); mySqlTokenizer.BackslashEscapes = (text.IndexOf("NO_BACKSLASH_ESCAPES") == -1); for (string text2 = StringUtility.ToLowerInvariant(mySqlTokenizer.NextToken()); text2 != null; text2 = mySqlTokenizer.NextToken()) { if (StringUtility.ToUpperInvariant(text2) == "VALUES" && !mySqlTokenizer.Quoted) { text2 = mySqlTokenizer.NextToken(); int num = 1; while (text2 != null) { this.batchableCommandText += text2; text2 = mySqlTokenizer.NextToken(); if (text2 == "(") { num++; } else { if (text2 == ")") { num--; } } if (num == 0) { break; } } if (text2 != null) { this.batchableCommandText += text2; } text2 = mySqlTokenizer.NextToken(); if (text2 != null && (text2 == "," || StringUtility.ToUpperInvariant(text2) == "ON")) { this.batchableCommandText = null; break; } } } } else { this.batchableCommandText = this.CommandText; } } return(this.batchableCommandText); }
private void EnsureCommandIsReadOnly(string sql) { sql = StringUtility.ToLowerInvariant(sql); if (!sql.StartsWith("select") && !sql.StartsWith("show")) { Throw(new MySqlException(Resources.ReplicatedConnectionsAllowOnlyReadonlyStatements)); } if (sql.EndsWith("for update") || sql.EndsWith("lock in share mode")) { Throw(new MySqlException(Resources.ReplicatedConnectionsAllowOnlyReadonlyStatements)); } }
public MySqlConnectionStringOption(string keyword, string synonyms, Type baseType, object defaultValue, bool obsolete, XSetterDelegate setter, XGetterDelegate getter) { Keyword = StringUtility.ToLowerInvariant(keyword); if (synonyms != null) { Synonyms = StringUtility.ToLowerInvariant(synonyms).Split(','); } BaseType = baseType; Obsolete = obsolete; DefaultValue = defaultValue; XSetter = setter; XGetter = getter; IsCustomized = true; }
public MySqlConnectionStringOption(string keyword, string synonyms, Type baseType, object defaultValue, bool obsolete, MySqlConnectionStringOption.SetterDelegate setter, MySqlConnectionStringOption.GetterDelegate getter) { this.Keyword = StringUtility.ToLowerInvariant(keyword); if (synonyms != null) { this.Synonyms = StringUtility.ToLowerInvariant(synonyms).Split(new char[] { ',' }); } this.BaseType = baseType; this.Obsolete = obsolete; this.DefaultValue = defaultValue; this.Setter = setter; this.Getter = getter; }
/// <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); } }
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); } }
internal string GetCommandTextForBatching() { if (BatchableCommandText == null) { // if the command starts with insert and is "simple" enough, then // we can use the multi-value form of insert if (String.Compare(CommandText.Substring(0, 6), "INSERT", StringComparison.OrdinalIgnoreCase) == 0) { MySqlCommand cmd = new MySqlCommand("SELECT @@sql_mode", Connection); string sql_mode = StringUtility.ToUpperInvariant(cmd.ExecuteScalar().ToString()); MySqlTokenizer tokenizer = new MySqlTokenizer(CommandText); tokenizer.AnsiQuotes = sql_mode.IndexOf("ANSI_QUOTES") != -1; tokenizer.BackslashEscapes = sql_mode.IndexOf("NO_BACKSLASH_ESCAPES") == -1; string token = StringUtility.ToLowerInvariant(tokenizer.NextToken()); while (token != null) { if (StringUtility.ToUpperInvariant(token) == "VALUES" && !tokenizer.Quoted) { token = tokenizer.NextToken(); Debug.Assert(token == "("); // find matching right paren, and ensure that parens // are balanced. int openParenCount = 1; while (token != null) { BatchableCommandText += token; token = tokenizer.NextToken(); if (token == "(") { openParenCount++; } else if (token == ")") { openParenCount--; } if (openParenCount == 0) { break; } } if (token != null) { BatchableCommandText += token; } token = tokenizer.NextToken(); if (token != null && (token == "," || StringUtility.ToUpperInvariant(token) == "ON")) { BatchableCommandText = null; break; } } token = tokenizer.NextToken(); } } // Otherwise use the command verbatim else { BatchableCommandText = CommandText; } } return(BatchableCommandText); }
public virtual MySqlSchemaCollection GetProcedures(string[] restrictions) { MySqlSchemaCollection dt = new MySqlSchemaCollection("Procedures"); dt.AddColumn("SPECIFIC_NAME", typeof(string)); dt.AddColumn("ROUTINE_CATALOG", typeof(string)); dt.AddColumn("ROUTINE_SCHEMA", typeof(string)); dt.AddColumn("ROUTINE_NAME", typeof(string)); dt.AddColumn("ROUTINE_TYPE", typeof(string)); dt.AddColumn("DTD_IDENTIFIER", typeof(string)); dt.AddColumn("ROUTINE_BODY", typeof(string)); dt.AddColumn("ROUTINE_DEFINITION", typeof(string)); dt.AddColumn("EXTERNAL_NAME", typeof(string)); dt.AddColumn("EXTERNAL_LANGUAGE", typeof(string)); dt.AddColumn("PARAMETER_STYLE", typeof(string)); dt.AddColumn("IS_DETERMINISTIC", typeof(string)); dt.AddColumn("SQL_DATA_ACCESS", typeof(string)); dt.AddColumn("SQL_PATH", typeof(string)); dt.AddColumn("SECURITY_TYPE", typeof(string)); dt.AddColumn("CREATED", typeof(DateTime)); dt.AddColumn("LAST_ALTERED", typeof(DateTime)); dt.AddColumn("SQL_MODE", typeof(string)); dt.AddColumn("ROUTINE_COMMENT", typeof(string)); dt.AddColumn("DEFINER", typeof(string)); StringBuilder sql = new StringBuilder("SELECT * FROM mysql.proc WHERE 1=1"); if (restrictions != null) { if (restrictions.Length >= 2 && restrictions[1] != null) { sql.AppendFormat(CultureInfo.InvariantCulture, " AND db LIKE '{0}'", restrictions[1]); } if (restrictions.Length >= 3 && restrictions[2] != null) { sql.AppendFormat(CultureInfo.InvariantCulture, " AND name LIKE '{0}'", restrictions[2]); } if (restrictions.Length >= 4 && restrictions[3] != null) { sql.AppendFormat(CultureInfo.InvariantCulture, " AND type LIKE '{0}'", restrictions[3]); } } MySqlCommand cmd = new MySqlCommand(sql.ToString(), connection); using (MySqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { MySqlSchemaRow row = dt.AddRow(); row["SPECIFIC_NAME"] = reader.GetString("specific_name"); row["ROUTINE_CATALOG"] = DBNull.Value; row["ROUTINE_SCHEMA"] = reader.GetString("db"); row["ROUTINE_NAME"] = reader.GetString("name"); string routineType = reader.GetString("type"); row["ROUTINE_TYPE"] = routineType; row["DTD_IDENTIFIER"] = StringUtility.ToLowerInvariant(routineType) == "function" ? (object)reader.GetString("returns") : DBNull.Value; row["ROUTINE_BODY"] = "SQL"; row["ROUTINE_DEFINITION"] = reader.GetString("body"); row["EXTERNAL_NAME"] = DBNull.Value; row["EXTERNAL_LANGUAGE"] = DBNull.Value; row["PARAMETER_STYLE"] = "SQL"; row["IS_DETERMINISTIC"] = reader.GetString("is_deterministic"); row["SQL_DATA_ACCESS"] = reader.GetString("sql_data_access"); row["SQL_PATH"] = DBNull.Value; row["SECURITY_TYPE"] = reader.GetString("security_type"); row["CREATED"] = reader.GetDateTime("created"); row["LAST_ALTERED"] = reader.GetDateTime("modified"); row["SQL_MODE"] = reader.GetString("sql_mode"); row["ROUTINE_COMMENT"] = reader.GetString("comment"); row["DEFINER"] = reader.GetString("definer"); } } return(dt); }
private List <ScriptStatement> BreakIntoStatements(bool ansiQuotes, bool noBackslashEscapes) { string currentDelimiter = Delimiter; int startPos = 0; List <ScriptStatement> statements = new List <ScriptStatement>(); List <int> lineNumbers = BreakScriptIntoLines(); MySqlTokenizer tokenizer = new MySqlTokenizer(query); tokenizer.AnsiQuotes = ansiQuotes; tokenizer.BackslashEscapes = !noBackslashEscapes; string token = tokenizer.NextToken(); while (token != null) { if (!tokenizer.Quoted) { if (StringUtility.ToLowerInvariant(token) == "delimiter") { tokenizer.NextToken(); AdjustDelimiterEnd(tokenizer); currentDelimiter = query.Substring(tokenizer.StartIndex, tokenizer.StopIndex - tokenizer.StartIndex).Trim(); startPos = tokenizer.StopIndex; } else { // this handles the case where our tokenizer reads part of the // delimiter if (currentDelimiter.StartsWith(token, StringComparison.OrdinalIgnoreCase)) { if ((tokenizer.StartIndex + currentDelimiter.Length) <= query.Length) { if (query.Substring(tokenizer.StartIndex, currentDelimiter.Length) == currentDelimiter) { token = currentDelimiter; tokenizer.Position = tokenizer.StartIndex + currentDelimiter.Length; tokenizer.StopIndex = tokenizer.Position; } } } int delimiterPos = token.IndexOf(currentDelimiter, StringComparison.OrdinalIgnoreCase); if (delimiterPos != -1) { int endPos = tokenizer.StopIndex - token.Length + delimiterPos; if (tokenizer.StopIndex == query.Length - 1) { endPos++; } string currentQuery = query.Substring(startPos, endPos - startPos); ScriptStatement statement = new ScriptStatement(); statement.text = currentQuery.Trim(); statement.line = FindLineNumber(startPos, lineNumbers); statement.position = startPos - lineNumbers[statement.line]; statements.Add(statement); startPos = endPos + currentDelimiter.Length; } } } token = tokenizer.NextToken(); } // now clean up the last statement if (startPos < query.Length - 1) { string sqlLeftOver = query.Substring(startPos).Trim(); if (!String.IsNullOrEmpty(sqlLeftOver)) { ScriptStatement statement = new ScriptStatement(); statement.text = sqlLeftOver; statement.line = FindLineNumber(startPos, lineNumbers); statement.position = startPos - lineNumbers[statement.line]; statements.Add(statement); } } return(statements); }