annotate Source/Data/DataProvider/MonoSqliteDataProvider.cs @ 4:f757da6161a1

!bug 100 + 2h fixed gregression
author cin
date Sun, 24 Aug 2014 17:57:42 +0400
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Data.Common;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Diagnostics;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Text;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Xml;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 // System.Data.SQLite.dll must be referenced.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 // http://sqlite.phxsoftware.com/
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 using Mono.Data.Sqlite;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 namespace BLToolkit.Data.DataProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 /// Implements access to the Data Provider for SQLite.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 public sealed class SQLiteDataProvider: DataProviderBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 /// Creates the database connection object.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 /// <returns>The database connection object.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 public override IDbConnection CreateConnectionObject()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 return new SqliteConnection();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 /// Creates the data adapter object.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 /// <returns>A data adapter object.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 public override DbDataAdapter CreateDataAdapterObject()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 return new SqliteDataAdapter();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 /// Populates the specified IDbCommand object's Parameters collection with
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 /// parameter information for the stored procedure specified in the IDbCommand.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 /// <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>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 public override bool DeriveParameters(IDbCommand command)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 // SQLiteCommandBuilder does not implement DeriveParameters.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 // This is not surprising, since SQLite has no support for stored procs.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 public override object Convert(object value, ConvertType convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 switch (convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 case ConvertType.NameToQueryParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 case ConvertType.NameToParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 return "@" + value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 case ConvertType.NameToQueryField:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 case ConvertType.NameToQueryTable:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 string name = (string)value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 if (name.Length > 0 && name[0] == '[')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 if (name.IndexOf('.') > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 value = string.Join("].[", name.Split('.'));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 return "[" + value + "]";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 case ConvertType.ParameterToName:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 string name = (string)value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 return name.Length > 0 && name[0] == '@'? name.Substring(1): name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 case ConvertType.ExceptionToErrorNumber:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 if (value is SqliteException)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 return ((SqliteException)value).ErrorCode;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 public override void AttachParameter(IDbCommand command, IDbDataParameter parameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 if (parameter.Direction == ParameterDirection.Input || parameter.Direction == ParameterDirection.InputOutput)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 if (parameter.Value is XmlDocument)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 parameter.Value = Encoding.UTF8.GetBytes(((XmlDocument) parameter.Value).InnerXml);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 parameter.DbType = DbType.Binary;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 base.AttachParameter(command, parameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 /// Returns connection type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 /// <value>An instance of the <see cref="Type"/> class.</value>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 public override Type ConnectionType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 get { return typeof(SqliteConnection); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 /// Returns the data provider name.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataProvider Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 /// <value>Data provider name.</value>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 public override string Name
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 get { return "SQLite"; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 public class SQLiteMappingSchema : Mapping.MappingSchema
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 #region Convert
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 public override XmlReader ConvertToXmlReader(object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 if (value is byte[])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 value = Encoding.UTF8.GetString((byte[])value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 return base.ConvertToXmlReader(value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 public override XmlDocument ConvertToXmlDocument(object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 if (value is byte[])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 value = Encoding.UTF8.GetString((byte[])value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 return base.ConvertToXmlDocument(value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 }