private IReadOnlyList GetUserTableColumns()

in src/TriggersBinding/MySqlTriggerListener.cs [182:232]


        private IReadOnlyList<string> GetUserTableColumns(MySqlConnection connection, MySqlObject userTable, CancellationToken cancellationToken)
        {
            const int NameIndex = 0, TypeIndex = 1;
            string getUserTableColumnsQuery = $@"
                    SELECT COLUMN_NAME, DATA_TYPE
                    FROM INFORMATION_SCHEMA.COLUMNS
                    WHERE table_name = {userTable.SingleQuotedName}
                    AND table_schema = {userTable.SingleQuotedSchema}
                    AND column_name <> {UpdateAtColumnName.AsSingleQuotedString()};
            ";

            using (var getUserTableColumnsCommand = new MySqlCommand(getUserTableColumnsQuery, connection))
            using (MySqlDataReader reader = getUserTableColumnsCommand.ExecuteReaderWithLogging(this._logger))
            {
                var userTableColumns = new List<string>();
                var userDefinedTypeColumns = new List<(string name, string type)>();

                while (reader.Read())
                {
                    cancellationToken.ThrowIfCancellationRequested();
                    string columnName = reader.GetString(NameIndex);
                    string columnType = reader.GetString(TypeIndex);

                    userTableColumns.Add(columnName);

                    // if column data type in a list of unsupported data types then 
                    if (UnsupportedColumnDataTypes.Contains(columnType))
                    {
                        userDefinedTypeColumns.Add((columnName, columnType));
                    }
                }

                if (userDefinedTypeColumns.Count > 0)
                {
                    string columnNamesAndTypes = string.Join(", ", userDefinedTypeColumns.Select(col => $"'{col.name}' (type: {col.type})"));
                    throw new InvalidOperationException($"Found column(s) with unsupported type(s): {columnNamesAndTypes} in table: '{this._userTable.FullName}'.");
                }

                var conflictingColumnNames = userTableColumns.Intersect(ReservedColumnNames).ToList();

                if (conflictingColumnNames.Count > 0)
                {
                    string columnNames = string.Join(", ", conflictingColumnNames.Select(col => $"'{col}'"));
                    throw new InvalidOperationException($"Found reserved column name(s): {columnNames} in table: '{this._userTable.FullName}'." +
                        " Please rename them to be able to use trigger binding.");
                }

                this._logger.LogDebug($"Fetching Table Columns");
                return userTableColumns;
            }
        }