Mercurial > pub > bltoolkit
diff Source/Data/DataProvider/SQLiteDataProvider.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/SQLiteDataProvider.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,215 @@ +using System; +using System.Data; +using System.Data.Common; +using System.Data.SQLite; +using System.Diagnostics; +using System.Text; +using System.Xml; + +using BLToolkit.Data.Sql.SqlProvider; +using BLToolkit.Mapping; +// System.Data.SQLite.dll must be referenced. +// http://sqlite.phxsoftware.com/ +// + +namespace BLToolkit.Data.DataProvider +{ + /// <summary> + /// Implements access to the Data Provider for SQLite. + /// </summary> + /// <remarks> + /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example. + /// </remarks> + /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso> + public sealed class SQLiteDataProvider : DataProviderBase + { + /// <summary> + /// Returns connection type. + /// </summary> + /// <remarks> + /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example. + /// </remarks> + /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso> + /// <value>An instance of the <see cref="Type"/> class.</value> + public override Type ConnectionType + { + get { return typeof (SQLiteConnection); } + } + + /// <summary> + /// Returns the data provider name. + /// </summary> + /// <remarks> + /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example. + /// </remarks> + /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataProvider Method</seealso> + /// <value>Data provider name.</value> + public override string Name + { + get { return DataProvider.ProviderName.SQLite; } + } + + /// <summary> + /// Creates the database connection object. + /// </summary> + /// <remarks> + /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example. + /// </remarks> + /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso> + /// <returns>The database connection object.</returns> + public override IDbConnection CreateConnectionObject() + { + return new SQLiteConnection(); + } + + /// <summary> + /// Creates the data adapter object. + /// </summary> + /// <remarks> + /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example. + /// </remarks> + /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso> + /// <returns>A data adapter object.</returns> + public override DbDataAdapter CreateDataAdapterObject() + { + return new SQLiteDataAdapter(); + } + + /// <summary> + /// Populates the specified IDbCommand object's Parameters collection with + /// parameter information for the stored procedure specified in the IDbCommand. + /// </summary> + /// <remarks> + /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example. + /// </remarks> + /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso> + /// <param name="command">The IDbCommand referencing the stored procedure for which the parameter information is to be derived. The derived parameters will be populated into the Parameters of this command.</param> + public override bool DeriveParameters(IDbCommand command) + { + // SQLiteCommandBuilder does not implement DeriveParameters. + // This is not surprising, since SQLite has no support for stored procs. + // + return false; + } + + public override object Convert(object value, ConvertType convertType) + { + switch (convertType) + { + case ConvertType.ExceptionToErrorNumber: + { + if (value is SQLiteException) + return ((SQLiteException) value).ErrorCode; + break; + } + } + + return SqlProvider.Convert(value, convertType); + } + + public override DataExceptionType ConvertErrorNumberToDataExceptionType(int number) + { + switch (number) + { + case 19: return DataExceptionType.ConstraintViolation; + } + return DataExceptionType.Undefined; + } + + public override void AttachParameter(IDbCommand command, IDbDataParameter parameter) + { + if (parameter.Direction == ParameterDirection.Input || parameter.Direction == ParameterDirection.InputOutput) + { + if (parameter.Value is XmlDocument) + { + parameter.Value = Encoding.UTF8.GetBytes(((XmlDocument) parameter.Value).InnerXml); + parameter.DbType = DbType.Binary; + } + } + + base.AttachParameter(command, parameter); + } + + public override void SetParameterValue(IDbDataParameter parameter, object value) + { + if (parameter.DbType == DbType.DateTime2) + parameter.DbType = DbType.DateTime; + + base.SetParameterValue(parameter, value); + } + + public override ISqlProvider CreateSqlProvider() + { + return new SQLiteSqlProvider(); + } + + #region Nested type: LoverFunction + /// <summary> + /// SQLite built-in text processor is ANSI-only Just override it. + /// </summary> + [SQLiteFunction(Name = "lower", Arguments = 1, FuncType = FunctionType.Scalar)] + internal class LoverFunction : SQLiteFunction + { + public override object Invoke(object[] args) + { + Debug.Assert(args != null && args.Length == 1); + var arg = args[0]; + + Debug.Assert(arg is string || arg is DBNull || arg is byte[]); + return + arg is string + ? ((string) arg).ToLower() + : arg is byte[] + ? Encoding.UTF8.GetString((byte[]) arg).ToLower() + : arg; + } + } + #endregion + + #region Nested type: SQLiteMappingSchema + public class SQLiteMappingSchema : MappingSchema + { + #region Convert + public override XmlReader ConvertToXmlReader(object value) + { + if (value is byte[]) + value = Encoding.UTF8.GetString((byte[]) value); + + return base.ConvertToXmlReader(value); + } + + public override XmlDocument ConvertToXmlDocument(object value) + { + if (value is byte[]) + value = Encoding.UTF8.GetString((byte[]) value); + + return base.ConvertToXmlDocument(value); + } + #endregion + } + #endregion + + #region Nested type: UpperFunction + /// <summary> + /// SQLite built-in text processor is ANSI-only Just override it. + /// </summary> + [SQLiteFunction(Name = "upper", Arguments = 1, FuncType = FunctionType.Scalar)] + internal class UpperFunction : SQLiteFunction + { + public override object Invoke(object[] args) + { + Debug.Assert(args != null && args.Length == 1); + var arg = args[0]; + + Debug.Assert(arg is string || arg is DBNull || arg is byte[]); + return + arg is string + ? ((string) arg).ToUpper() + : arg is byte[] + ? Encoding.UTF8.GetString((byte[]) arg).ToUpper() + : arg; + } + } + #endregion + } +} \ No newline at end of file