Mercurial > pub > bltoolkit
diff Source/Data/DataProvider/PostgreSQLDataProvider.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/Data/DataProvider/PostgreSQLDataProvider.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,333 @@ +using System; +using System.Data; +using System.Data.Common; + +using Npgsql; + +namespace BLToolkit.Data.DataProvider +{ + using Sql.SqlProvider; + using BLToolkit.Mapping; + + public class PostgreSQLDataProvider : DataProviderBase + { + #region Configurable + + public enum CaseConvert + { + None, + Lower, + Upper + } + + public static CaseConvert QueryCaseConvert = CaseConvert.None; + + public static bool QuoteIdentifiers + { + get { return PostgreSQLSqlProvider.QuoteIdentifiers; } + set { PostgreSQLSqlProvider.QuoteIdentifiers = value; } + } + + public override void Configure(System.Collections.Specialized.NameValueCollection attributes) + { + var quoteIdentifiers = attributes["QuoteIdentifiers"]; + + if (quoteIdentifiers != null) + QuoteIdentifiers = Common.Convert.ToBoolean(quoteIdentifiers); + + var queryCaseConcert = attributes["QueryCaseConvert"]; + if (queryCaseConcert != null) + { + try + { + QueryCaseConvert = (CaseConvert)Enum.Parse(typeof(CaseConvert), queryCaseConcert, true); + } + catch { } + } + + base.Configure(attributes); + } + + #endregion + + public override IDbConnection CreateConnectionObject() + { + return new NpgsqlConnection(); + } + + public override DbDataAdapter CreateDataAdapterObject() + { + return new NpgsqlDataAdapter(); + } + + public override bool DeriveParameters(IDbCommand command) + { + NpgsqlCommandBuilder.DeriveParameters((NpgsqlCommand)command); + return true; + } + + public override void SetParameterValue(IDbDataParameter parameter, object value) + { + if(value is Enum) + { + var type = Enum.GetUnderlyingType(value.GetType()); + value = (MappingSchema ?? Map.DefaultSchema).ConvertChangeType(value, type); + + } + base.SetParameterValue(parameter, value); + } + + public override object Convert(object value, ConvertType convertType) + { + switch (convertType) + { + case ConvertType.ExceptionToErrorNumber: + if (value is NpgsqlException) + { + var ex = (NpgsqlException)value; + + foreach (NpgsqlError error in ex.Errors) + return error.Code; + + return 0; + } + + break; + } + + return SqlProvider.Convert(value, convertType); + } + + public override Type ConnectionType + { + get { return typeof(NpgsqlConnection); } + } + + public override string Name + { + get { return DataProvider.ProviderName.PostgreSQL; } + } + + public override int MaxBatchSize + { + get { return 0; } + } + + public override ISqlProvider CreateSqlProvider() + { + return new PostgreSQLSqlProvider(); + } + + public override void PrepareCommand(ref CommandType commandType, ref string commandText, ref IDbDataParameter[] commandParameters) + { + if (QueryCaseConvert == CaseConvert.Lower) + commandText = commandText.ToLower(); + else if (QueryCaseConvert == CaseConvert.Upper) + commandText = commandText.ToUpper(); + + base.PrepareCommand(ref commandType, ref commandText, ref commandParameters); + } + + public override bool CanReuseCommand(IDbCommand command, CommandType newCommandType) + { + return command.CommandType == newCommandType; + } + + public override IDataReader GetDataReader(MappingSchema schema, IDataReader dataReader) + { + return + dataReader is NpgsqlDataReader + ? new NpgsqlDataReaderEx(schema, (NpgsqlDataReader)dataReader) + : base.GetDataReader(schema, dataReader); + } + + class NpgsqlDataReaderEx : IDataReader + { + private readonly NpgsqlDataReader _reader; + private readonly MappingSchema _schema; + + public NpgsqlDataReaderEx(MappingSchema schema, NpgsqlDataReader reader) + { + _reader = reader; + _schema = schema; + } + + #region IDataReader Members + + public void Close() + { + _reader.Close(); + } + + public int Depth + { + get { return _reader.Depth; } + } + + public DataTable GetSchemaTable() + { + return _reader.GetSchemaTable(); + } + + public bool IsClosed + { + get { return _reader.IsClosed; } + } + + public bool NextResult() + { + return _reader.NextResult(); + } + + public bool Read() + { + return _reader.Read(); + } + + public int RecordsAffected + { + get { return _reader.RecordsAffected; } + } + + #endregion + + #region IDisposable Members + + public void Dispose() + { + _reader.Dispose(); + } + + #endregion + + #region IDataRecord Members + + public int FieldCount + { + get { return _reader.FieldCount; } + } + + public bool GetBoolean(int i) + { + return _reader.GetBoolean(i); + } + + public byte GetByte(int i) + { + return _schema.ConvertToByte(_reader.GetValue(i)); + } + + public long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length) + { + return _reader.GetBytes(i, fieldOffset, buffer, bufferoffset, length); + } + + public char GetChar(int i) + { + return _reader.GetChar(i); + } + + public long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length) + { + return _reader.GetChars(i, fieldoffset, buffer, bufferoffset, length); + } + + public IDataReader GetData(int i) + { + return _reader.GetData(i); + } + + public string GetDataTypeName(int i) + { + return _reader.GetDataTypeName(i); + } + + public DateTime GetDateTime(int i) + { + return _reader.GetDateTime(i); + } + + public decimal GetDecimal(int i) + { + return _reader.GetDecimal(i); + } + + public double GetDouble(int i) + { + return _reader.GetDouble(i); + } + + public Type GetFieldType(int i) + { + return _reader.GetFieldType(i); + } + + public float GetFloat(int i) + { + return _reader.GetFloat(i); + } + + public Guid GetGuid(int i) + { + return _reader.GetGuid(i); + } + + public short GetInt16(int i) + { + return _reader.GetInt16(i); + } + + public int GetInt32(int i) + { + return _reader.GetInt32(i); + } + + public long GetInt64(int i) + { + return _reader.GetInt64(i); + } + + public string GetName(int i) + { + return _reader.GetName(i); + } + + public int GetOrdinal(string name) + { + return _reader.GetOrdinal(name); + } + + public string GetString(int i) + { + return _reader.GetString(i); + } + + public object GetValue(int i) + { + return _reader.GetValue(i); + } + + public int GetValues(object[] values) + { + return _reader.GetValues(values); + } + + public bool IsDBNull(int i) + { + return _reader.IsDBNull(i); + } + + public object this[string name] + { + get { return _reader[name]; } + } + + public object this[int i] + { + get { return _reader[i]; } + } + + #endregion + } + } +}