Updated Firebird provider with latest sources from sourceforge
[mono.git] / mcs / class / FirebirdSql.Data.Firebird / FirebirdSql.Data.Common / IscHelper.cs
1 /*\r
2  *      Firebird ADO.NET Data provider for .NET and     Mono \r
3  * \r
4  *         The contents of this file are subject to the Initial \r
5  *         Developer's Public License Version 1.0 (the "License"); \r
6  *         you may not use this file except in compliance with the \r
7  *         License. You may obtain a copy of the License at \r
8  *         http://www.firebirdsql.org/index.php?op=doc&id=idpl\r
9  *\r
10  *         Software distributed under the License is distributed on \r
11  *         an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either \r
12  *         express or implied. See the License for the specific \r
13  *         language governing rights and limitations under the License.\r
14  * \r
15  *      Copyright (c) 2002, 2005 Carlos Guzman Alvarez\r
16  *      All Rights Reserved.\r
17  */\r
18 \r
19 using System;\r
20 using System.Collections;\r
21 using System.Globalization;\r
22 using System.Resources;\r
23 using System.Text;\r
24 \r
25 namespace FirebirdSql.Data.Common\r
26 {\r
27         internal sealed class IscHelper\r
28         {\r
29                 #region Constructors\r
30 \r
31                 private IscHelper()\r
32                 {\r
33                 }\r
34 \r
35                 #endregion\r
36 \r
37                 #region General Static Methods\r
38 \r
39                 public static ArrayList ParseDatabaseInfo(byte[] buffer)\r
40                 {\r
41                         ArrayList info = new ArrayList();\r
42 \r
43                         int pos         = 0;\r
44                         int length      = 0;\r
45                         int type        = 0;\r
46 \r
47                         while ((type = buffer[pos++]) != IscCodes.isc_info_end)\r
48                         {\r
49                                 length = VaxInteger(buffer, pos, 2);\r
50                                 pos += 2;\r
51 \r
52                                 switch (type)\r
53                                 {\r
54                                         //\r
55                                         // Database     characteristics\r
56                                         //\r
57                                         case IscCodes.isc_info_allocation:\r
58                                                 // Number of database pages     allocated\r
59                                                 info.Add(VaxInteger(buffer, pos, length));\r
60                                                 break;\r
61 \r
62                                         case IscCodes.isc_info_base_level:\r
63                                                 /* Database     version (level) number:\r
64                                                  *              1 byte containing the number 1\r
65                                                  *              1 byte containing the version number\r
66                                                  */\r
67                                                 info.Add(String.Format(CultureInfo.CurrentCulture, "{0}.{1}", buffer[pos], buffer[pos + 1]));\r
68                                                 break;\r
69 \r
70                                         case IscCodes.isc_info_db_id:\r
71                                                 /* Database     file name and site name:\r
72                                                  *              \95 1     byte containing the     number 2\r
73                                                  *              \95 1     byte containing the     length, d, of the database file name in bytes\r
74                                                  *              \95 A     string of d     bytes, containing the database file     name\r
75                                                  *              \95 1     byte containing the     length, l, of the site name     in bytes\r
76                                                  *              \95 A     string of l     bytes, containing the site name\r
77                                                  */\r
78                                                 string  dbFile          = Encoding.Default.GetString(buffer, pos + 2, buffer[pos + 1]);\r
79                                                 int             sitePos         = pos + 2 + buffer[pos + 1];\r
80                                                 int             siteLength      = buffer[sitePos];\r
81                                                 string  siteName        = Encoding.Default.GetString(buffer, sitePos + 1, siteLength);\r
82 \r
83                                                 sitePos         += siteLength + 1;\r
84                                                 siteLength      = buffer[sitePos];\r
85                                                 siteName        += "." + Encoding.Default.GetString(buffer, sitePos + 1, siteLength);\r
86 \r
87                                                 info.Add(siteName + ":" + dbFile);\r
88                                                 break;\r
89 \r
90                                         case IscCodes.isc_info_implementation:\r
91                                                 /* Database     implementation number:\r
92                                                  *              \95 1     byte containing a 1\r
93                                                  *              \95 1     byte containing the     implementation number\r
94                                                  *              \95 1     byte containing a \93class\94 number, either 1 or 12\r
95                                                  */\r
96                                                 info.Add(String.Format(CultureInfo.CurrentCulture, "{0}.{1}.{2}", buffer[pos], buffer[pos + 1], buffer[pos + 2]));\r
97                                                 break;\r
98 \r
99                                         case IscCodes.isc_info_no_reserve:\r
100                                                 /* 0 or 1\r
101                                                  *              \95 0     indicates space is reserved     on each database page for holding\r
102                                                  *                      backup versions of modified     records [Default]\r
103                                                  *              \95 1     indicates no space is reserved for such records\r
104                                                  */\r
105                                                 info.Add(buffer[pos] == 1 ? true : false);\r
106                                                 break;\r
107 \r
108                                         case IscCodes.isc_info_ods_version:\r
109                                                 /* ODS major version number\r
110                                                  *              \95 Databases     with different major version numbers have different\r
111                                                  *                      physical layouts; a     database engine can     only access     databases\r
112                                                  *                      with a particular ODS major     version number\r
113                                                  *              \95 Trying to     attach to a     database with a different ODS number\r
114                                                  *                      results in an error\r
115                                                  */\r
116                                                 info.Add(VaxInteger(buffer, pos, length));\r
117                                                 break;\r
118 \r
119                                         case IscCodes.isc_info_ods_minor_version:\r
120                                                 /* On-disk structure (ODS) minor version number; an     increase in     a\r
121                                                  * minor version number indicates a     non-structural change, one that\r
122                                                  * still allows the     database to     be accessed     by database     engines with\r
123                                                  * the same     major version number but possibly different     minor\r
124                                                  * version numbers\r
125                                                  */\r
126                                                 info.Add(VaxInteger(buffer, pos, length));\r
127                                                 break;\r
128 \r
129                                         case IscCodes.isc_info_page_size:\r
130                                                 /* Number of bytes per page     of the attached database; use with\r
131                                                  * isc_info_allocation to determine     the     size of the     database\r
132                                                  */\r
133                                                 info.Add(VaxInteger(buffer, pos, length));\r
134                                                 break;\r
135 \r
136                                         case IscCodes.isc_info_isc_version:\r
137                                                 /* Version identification string of     the     database implementation:\r
138                                                  *              \95 1     byte containing the     number 1\r
139                                                  *              \95 1     byte specifying the     length, n, of the following     string\r
140                                                  *              \95 n     bytes containing the version identification     string\r
141                                                  */\r
142                                                 info.Add(Encoding.Default.GetString(buffer, pos + 2, buffer[pos + 1]));\r
143                                                 break;\r
144 \r
145                                         //\r
146                                         // Environmental characteristics\r
147                                         //\r
148 \r
149                                         case IscCodes.isc_info_current_memory:\r
150                                                 // Amount of server     memory (in bytes) currently     in use\r
151                                                 info.Add(VaxInteger(buffer, pos, length));\r
152                                                 break;\r
153 \r
154                                         case IscCodes.isc_info_forced_writes:\r
155                                                 /* Number specifying the mode in which database writes are performed\r
156                                                  * (0 for asynchronous, 1 for synchronous)\r
157                                                  */\r
158                                                 info.Add(buffer[pos] == 1 ? true : false);\r
159                                                 break;\r
160 \r
161                                         case IscCodes.isc_info_max_memory:\r
162                                                 /* Maximum amount of memory     (in     bytes) used     at one time     since the first\r
163                                                  * process attached     to the database\r
164                                                  */\r
165                                                 info.Add(VaxInteger(buffer, pos, length));\r
166                                                 break;\r
167 \r
168                                         case IscCodes.isc_info_num_buffers:\r
169                                                 // Number of memory     buffers currently allocated\r
170                                                 info.Add(VaxInteger(buffer, pos, length));\r
171                                                 break;\r
172 \r
173                                         case IscCodes.isc_info_sweep_interval:\r
174                                                 /* Number of transactions that are committed between \93sweeps\94 to\r
175                                                  * remove database record versions that are     no longer needed\r
176                                                  */\r
177                                                 info.Add(VaxInteger(buffer, pos, length));\r
178                                                 break;\r
179 \r
180                                         //\r
181                                         // Performance statistics\r
182                                         //\r
183 \r
184                                         case IscCodes.isc_info_fetches:\r
185                                                 // Number of reads from the     memory buffer cache\r
186                                                 info.Add(VaxInteger(buffer, pos, length));\r
187                                                 break;\r
188 \r
189                                         case IscCodes.isc_info_marks:\r
190                                                 // Number of writes     to the memory buffer cache\r
191                                                 info.Add(VaxInteger(buffer, pos, length));\r
192                                                 break;\r
193 \r
194                                         case IscCodes.isc_info_reads:\r
195                                                 // Number of page reads\r
196                                                 info.Add(VaxInteger(buffer, pos, length));\r
197                                                 break;\r
198 \r
199                                         case IscCodes.isc_info_writes:\r
200                                                 // Number of page writes\r
201                                                 info.Add(VaxInteger(buffer, pos, length));\r
202                                                 break;\r
203 \r
204                                         //\r
205                                         // Database     operation counts\r
206                                         //\r
207                                         case IscCodes.isc_info_backout_count:\r
208                                                 // Number of removals of a version of a record\r
209                                                 info.Add(VaxInteger(buffer, pos, length));\r
210                                                 break;\r
211 \r
212                                         case IscCodes.isc_info_delete_count:\r
213                                                 // Number of database deletes since     the     database was last attached\r
214                                                 info.Add(VaxInteger(buffer, pos, length));\r
215                                                 break;\r
216 \r
217                                         case IscCodes.isc_info_expunge_count:\r
218                                                 /* Number of removals of a record and all of its ancestors,     for     records\r
219                                                  * whose deletions have been committed\r
220                                                  */\r
221                                                 info.Add(VaxInteger(buffer, pos, length));\r
222                                                 break;\r
223 \r
224                                         case IscCodes.isc_info_insert_count:\r
225                                                 // Number of inserts into the database since the database was last attached     \r
226                                                 info.Add(VaxInteger(buffer, pos, length));\r
227                                                 break;\r
228 \r
229                                         case IscCodes.isc_info_purge_count:\r
230                                                 // Number of removals of old versions of fully mature records\r
231                                                 info.Add(VaxInteger(buffer, pos, length));\r
232                                                 break;\r
233 \r
234                                         case IscCodes.isc_info_read_idx_count:\r
235                                                 // Number of reads done via     an index since the database     was     last attached\r
236                                                 info.Add(VaxInteger(buffer, pos, length));\r
237                                                 break;\r
238 \r
239                                         case IscCodes.isc_info_read_seq_count:\r
240                                                 /* Number of sequential sequential table scans (row     reads) done     on each \r
241                                                  * table since the database     was     last attached\r
242                                                  */\r
243                                                 info.Add(VaxInteger(buffer, pos, length));\r
244                                                 break;\r
245 \r
246                                         case IscCodes.isc_info_update_count:\r
247                                                 // Number of database updates since     the     database was last attached\r
248                                                 info.Add(VaxInteger(buffer, pos, length));\r
249                                                 break;\r
250 \r
251                                         //\r
252                                         // Misc\r
253                                         //\r
254                                         case IscCodes.isc_info_firebird_version:\r
255                                                 info.Add(Encoding.Default.GetString(buffer, pos + 2, buffer[pos + 1]));\r
256                                                 break;\r
257 \r
258                                         case IscCodes.isc_info_db_class:\r
259                                                 int serverClass = VaxInteger(buffer, pos, length);\r
260                                                 if (serverClass == IscCodes.isc_info_db_class_classic_access)\r
261                                                 {\r
262                                                         info.Add("CLASSIC SERVER");\r
263                                                 }\r
264                                                 else\r
265                                                 {\r
266                                                         info.Add("SUPER SERVER");\r
267                                                 }\r
268                                                 break;\r
269 \r
270                                         case IscCodes.isc_info_db_read_only:\r
271                                                 info.Add(buffer[pos] == 1 ? true : false);\r
272                                                 break;\r
273 \r
274                                         case IscCodes.isc_info_db_size_in_pages:\r
275                                                 // Database     size in pages.\r
276                                                 info.Add(VaxInteger(buffer, pos, length));\r
277                                                 break;\r
278 \r
279                                         case IscCodes.isc_info_oldest_transaction:\r
280                                                 // Number of oldest     transaction\r
281                                                 info.Add(VaxInteger(buffer, pos, length));\r
282                                                 break;\r
283 \r
284                                         case IscCodes.isc_info_oldest_active:\r
285                                                 // Number of oldest     active transaction\r
286                                                 info.Add(VaxInteger(buffer, pos, length));\r
287                                                 break;\r
288 \r
289                                         case IscCodes.isc_info_oldest_snapshot:\r
290                                                 // Number of oldest     snapshot transaction\r
291                                                 info.Add(VaxInteger(buffer, pos, length));\r
292                                                 break;\r
293 \r
294                                         case IscCodes.isc_info_next_transaction:\r
295                                                 // Number of next transaction\r
296                                                 info.Add(VaxInteger(buffer, pos, length));\r
297                                                 break;\r
298 \r
299                                         case IscCodes.isc_info_active_transactions:\r
300                                                 // Number of active     transactions\r
301                                                 info.Add(VaxInteger(buffer, pos, length));\r
302                                                 break;\r
303 \r
304                     case IscCodes.isc_info_user_names:\r
305                         // Active user name\r
306                         info.Add(Encoding.Default.GetString(buffer, pos + 1, buffer[pos]));\r
307                         break;\r
308                                 }\r
309 \r
310                                 pos += length;\r
311                         }\r
312 \r
313                         return info;\r
314                 }\r
315 \r
316                 public static int VaxInteger(byte[] buffer, int index, int length)\r
317                 {\r
318                         int newValue;\r
319                         int shift;\r
320 \r
321                         newValue = shift = 0;\r
322 \r
323                         int i = index;\r
324                         while (--length >= 0)\r
325                         {\r
326                                 newValue += (buffer[i++] & 0xff) << shift;\r
327                                 shift += 8;\r
328                         }\r
329 \r
330                         return newValue;\r
331                 }\r
332 \r
333                 #endregion\r
334         }\r
335 }\r