/* Copyright (C) 2008 - 2011 Jordan Marr This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library. If not, see <http://www.gnu.org/licenses/>. */ using System.Collections.Generic; using System.Data; using System.Text.RegularExpressions; using System.Data.Common; namespace Marr.Data.Mapping { /// <summary> /// This class contains a list of column mappings. /// It also provides various methods to filter the collection. /// </summary> public class ColumnMapCollection : List<ColumnMap> { #region - Filters - public ColumnMap GetByColumnName(string columnName) { return Find(m => m.ColumnInfo.Name == columnName); } public ColumnMap GetByFieldName(string fieldName) { return Find(m => m.FieldName == fieldName); } /// <summary> /// Iterates through all fields marked as return values. /// </summary> public IEnumerable<ColumnMap> ReturnValues { get { foreach (ColumnMap map in this) if (map.ColumnInfo.ReturnValue) yield return map; } } /// <summary> /// Iterates through all fields that are not return values. /// </summary> public ColumnMapCollection NonReturnValues { get { ColumnMapCollection collection = new ColumnMapCollection(); foreach (ColumnMap map in this) if (!map.ColumnInfo.ReturnValue) collection.Add(map); return collection; } } /// <summary> /// Iterates through all fields marked as Output parameters or InputOutput. /// </summary> public IEnumerable<ColumnMap> OutputFields { get { foreach (ColumnMap map in this) if (map.ColumnInfo.ParamDirection == ParameterDirection.InputOutput || map.ColumnInfo.ParamDirection == ParameterDirection.Output) yield return map; } } /// <summary> /// Iterates through all fields marked as primary keys. /// </summary> public ColumnMapCollection PrimaryKeys { get { ColumnMapCollection keys = new ColumnMapCollection(); foreach (ColumnMap map in this) if (map.ColumnInfo.IsPrimaryKey) keys.Add(map); return keys; } } /// <summary> /// Parses and orders the parameters from the query text. /// Filters the list of mapped columns to match the parameters found in the sql query. /// All parameters starting with the '@' or ':' symbol are matched and returned. /// </summary> /// <param name="command">The command and parameters that are being parsed.</param> /// <returns>A list of mapped columns that are present in the sql statement as parameters.</returns> public ColumnMapCollection OrderParameters(DbCommand command) { if (command.CommandType == CommandType.Text && Count > 0) { string commandTypeString = command.GetType().ToString(); if (commandTypeString.Contains("Oracle") || commandTypeString.Contains("OleDb")) { ColumnMapCollection columns = new ColumnMapCollection(); // Find all @Parameters contained in the sql statement string paramPrefix = commandTypeString.Contains("Oracle") ? ":" : "@"; string regexString = string.Format(@"{0}[\w-]+", paramPrefix); Regex regex = new Regex(regexString); foreach (Match m in regex.Matches(command.CommandText)) { ColumnMap matchingColumn = Find(c => string.Concat(paramPrefix, c.ColumnInfo.Name.ToLower()) == m.Value.ToLower()); if (matchingColumn != null) columns.Add(matchingColumn); } return columns; } } return this; } #endregion #region - Actions - /// <summary> /// Set's each column's altname as the given prefix + the column name. /// Ex: /// Original column name: "ID" /// Passed in prefix: "PRODUCT_" /// Generated AltName: "PRODUCT_ID" /// </summary> /// <param name="prefix">The given prefix.</param> /// <returns></returns> public ColumnMapCollection PrefixAltNames(string prefix) { ForEach(c => c.ColumnInfo.AltName = c.ColumnInfo.Name.Insert(0, prefix)); return this; } /// <summary> /// Set's each column's altname as the column name + the given prefix. /// Ex: /// Original column name: "ID" /// Passed in suffix: "_PRODUCT" /// Generated AltName: "ID_PRODUCT" /// </summary> /// <param name="suffix"></param> /// <returns></returns> public ColumnMapCollection SuffixAltNames(string suffix) { ForEach(c => c.ColumnInfo.AltName = c.ColumnInfo.Name + suffix); return this; } #endregion } }