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);
        }
Exemple #3
0
        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);
                }
            }
        }
Exemple #4
0
        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);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        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);
        }
Exemple #9
0
        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]);
                }
            }
        }
Exemple #11
0
        /// <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);
            }
        }
Exemple #12
0
        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);
      }
    }
Exemple #15
0
        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);
      }
    }
Exemple #18
0
        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);
        }
Exemple #19
0
        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);
        }
Exemple #20
0
        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);
        }
Exemple #21
0
 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]);
     }
 }
Exemple #22
0
        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;
                }
                }
            }
        }
Exemple #23
0
        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);
        }
Exemple #24
0
        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];
                }
            }
        }
Exemple #25
0
        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);
        }
Exemple #26
0
        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);
            }
        }
Exemple #27
0
        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);
            }
        }
Exemple #29
0
        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);
        }
Exemple #30
0
 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 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 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);
        }
Exemple #45
0
 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);
              }
        }
Exemple #47
0
 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];
 }