annotate Source/Data/DataProvider/SQLiteDataProvider.cs @ 9:1e85f66cf767 default tip

update bltoolkit
author nickolay
date Thu, 05 Apr 2018 20:53:26 +0300
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.Data.SQLite;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Diagnostics;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Text;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using System.Xml;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using BLToolkit.Data.Sql.SqlProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 using BLToolkit.Mapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 // System.Data.SQLite.dll must be referenced.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 // http://sqlite.phxsoftware.com/
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 namespace BLToolkit.Data.DataProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 /// Implements access to the Data Provider for SQLite.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 public sealed class SQLiteDataProvider : DataProviderBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 /// Returns connection type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 /// <value>An instance of the <see cref="Type"/> class.</value>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 public override Type ConnectionType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 get { return typeof (SQLiteConnection); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 /// Returns the data provider name.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataProvider Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 /// <value>Data provider name.</value>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 public override string Name
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 get { return DataProvider.ProviderName.SQLite; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 /// Creates the database connection object.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 /// <returns>The database connection object.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 public override IDbConnection CreateConnectionObject()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 return new SQLiteConnection();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 /// Creates the data adapter object.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 /// <returns>A data adapter object.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 public override DbDataAdapter CreateDataAdapterObject()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 return new SQLiteDataAdapter();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 /// Populates the specified IDbCommand object's Parameters collection with
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 /// parameter information for the stored procedure specified in the IDbCommand.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 /// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 /// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 /// <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
87 public override bool DeriveParameters(IDbCommand command)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 // SQLiteCommandBuilder does not implement DeriveParameters.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 // This is not surprising, since SQLite has no support for stored procs.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 public override object Convert(object value, ConvertType convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 switch (convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 case ConvertType.ExceptionToErrorNumber:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 if (value is SQLiteException)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 return ((SQLiteException) value).ErrorCode;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 return SqlProvider.Convert(value, convertType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 public override DataExceptionType ConvertErrorNumberToDataExceptionType(int number)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 switch (number)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 case 19: return DataExceptionType.ConstraintViolation;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 return DataExceptionType.Undefined;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 public override void AttachParameter(IDbCommand command, IDbDataParameter parameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 if (parameter.Direction == ParameterDirection.Input || parameter.Direction == ParameterDirection.InputOutput)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 if (parameter.Value is XmlDocument)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 parameter.Value = Encoding.UTF8.GetBytes(((XmlDocument) parameter.Value).InnerXml);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 parameter.DbType = DbType.Binary;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 base.AttachParameter(command, parameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 public override void SetParameterValue(IDbDataParameter parameter, object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 if (parameter.DbType == DbType.DateTime2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 parameter.DbType = DbType.DateTime;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 base.SetParameterValue(parameter, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 public override ISqlProvider CreateSqlProvider()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 return new SQLiteSqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 #region Nested type: LoverFunction
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 /// SQLite built-in text processor is ANSI-only Just override it.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 [SQLiteFunction(Name = "lower", Arguments = 1, FuncType = FunctionType.Scalar)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 internal class LoverFunction : SQLiteFunction
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 public override object Invoke(object[] args)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 Debug.Assert(args != null && args.Length == 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 var arg = args[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 Debug.Assert(arg is string || arg is DBNull || arg is byte[]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 return
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 arg is string
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 ? ((string) arg).ToLower()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 : arg is byte[]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 ? Encoding.UTF8.GetString((byte[]) arg).ToLower()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 : arg;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 #region Nested type: SQLiteMappingSchema
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 public class SQLiteMappingSchema : MappingSchema
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 #region Convert
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 public override XmlReader ConvertToXmlReader(object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 if (value is byte[])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 value = Encoding.UTF8.GetString((byte[]) value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 return base.ConvertToXmlReader(value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 public override XmlDocument ConvertToXmlDocument(object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 if (value is byte[])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 value = Encoding.UTF8.GetString((byte[]) value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 return base.ConvertToXmlDocument(value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 #region Nested type: UpperFunction
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 /// SQLite built-in text processor is ANSI-only Just override it.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 [SQLiteFunction(Name = "upper", Arguments = 1, FuncType = FunctionType.Scalar)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 internal class UpperFunction : SQLiteFunction
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 public override object Invoke(object[] args)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 Debug.Assert(args != null && args.Length == 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 var arg = args[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 Debug.Assert(arg is string || arg is DBNull || arg is byte[]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 return
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 arg is string
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 ? ((string) arg).ToUpper()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 : arg is byte[]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 ? Encoding.UTF8.GetString((byte[]) arg).ToUpper()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 : arg;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 }