Datei: Provider/PostGresProvider/NDO.Postgre/Provider.cs

Last Commit (e9b343b)
1 //
2 // Copyright (c) 2002-2016 Mirko Matytschak
3 // (www.netdataobjects.de)
4 //
5 // Author: Mirko Matytschak
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
8 // documentation files (the "Software"), to deal in the Software without restriction, including without limitation
9 // the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
10 // Software, and to permit persons to whom the Software is furnished to do so, subject to the following
11 // conditions:
12
13 // The above copyright notice and this permission notice shall be included in all copies or substantial portions
14 // of the Software.
15 //
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
17 // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
19 // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20 // DEALINGS IN THE SOFTWARE.
21
22
23 using System;
24 using System.Text;
25 using System.Text.RegularExpressions;
26 using System.Data;
27 using System.Data.Common;
28 using NDOInterfaces;
29 using System.Collections;
30 using Npgsql;
31 using NpgsqlTypes;
32
33 namespace NDO.PostGreProvider
34 {
35 ····/// <summary>
36 ····/// Sample adapter class to connect new ADO.NET Providers with NDO.
37 ····/// This Adapter is based on the Npgsql Npgsql Data Connector
38 ····/// </summary>
39 ····public class Provider : NDOAbstractProvider
40 ····{
41 ········// The following methods provide objects of provider classes
42 ········// which implement common interfaces in .NET:
43 ········// IDbConnection, IDbCommand, DbDataAdapter and the Parameter objects
44 ········#region Provide specialized type objects
45 ········public override System.Data.IDbConnection NewConnection(string connectionString)
46 ········{
47 ············return new NpgsqlConnection(connectionString);
48 ········}
49
50 ········public override System.Data.IDbCommand NewSqlCommand(System.Data.IDbConnection connection)
51 ········{
52 ············NpgsqlCommand command = new NpgsqlCommand();
53 ············command.Connection = (NpgsqlConnection)connection;
54 ············return command;
55 ········}
56
57 ········public override DbDataAdapter NewDataAdapter(System.Data.IDbCommand select, System.Data.IDbCommand update, System.Data.IDbCommand insert, System.Data.IDbCommand delete)
58 ········{
59 ············NpgsqlDataAdapter da = new NpgsqlDataAdapter();
60 ············da.SelectCommand = (NpgsqlCommand)select;
61 ············da.UpdateCommand = (NpgsqlCommand)update;
62 ············da.InsertCommand = (NpgsqlCommand)insert;
63 ············da.DeleteCommand = (NpgsqlCommand)delete;
64 ············return da;
65 ········}
66
67 ········/// <summary>
68 ········/// See <see cref="IProvider"> IProvider interface </see>
69 ········/// </summary>
70 ········public override object NewCommandBuilder(DbDataAdapter dataAdapter)
71 ········{
72 ············return new NpgsqlCommandBuilder((NpgsqlDataAdapter)dataAdapter);
73 ········}
74
75
76 ········public override IDataParameter AddParameter(System.Data.IDbCommand command, string parameterName, object dbType, int size, string columnName)
77 ········{
78 ············return ((NpgsqlCommand)command).Parameters.Add(new NpgsqlParameter(parameterName, (NpgsqlDbType)dbType, size, columnName));············
79 ········}
80
81 ········public override IDataParameter AddParameter(IDbCommand command, string parameterName, object dbType, int size, ParameterDirection dir, bool isNullable, byte precision, byte scale, string srcColumn, DataRowVersion srcVersion, object value)
82 ········{
83 ············return ((NpgsqlCommand)command).Parameters.Add(new NpgsqlParameter(parameterName, (NpgsqlDbType)dbType, size, srcColumn, dir, isNullable, precision, scale, srcVersion, value));
84 ········}
85 ········#endregion
86
87 ········// The following method convert System.Type objects to NpgsqlDbType-Members
88 ········// For your own adapter use members of the database type emumeration
89 ········// of your ADO.NET provider
90 ········#region Provide NpgsqlDbType members
91 ········public override object GetDbType(Type t)
92 ········{
93 ············t = base.ConvertNullableType(t);
94 ············if (t == typeof(bool))
95 ················return NpgsqlDbType.Boolean;
96 ············else if ( t == typeof(byte) )
97 ················return NpgsqlDbType.Smallint;
98 ············else if ( t == typeof(sbyte) )
99 ················return NpgsqlDbType.Smallint;
100 ············else if ( t == typeof(char) )
101 ················return NpgsqlDbType.Smallint;
102 ············else if ( t == typeof(short))
103 ················return NpgsqlDbType.Smallint;
104 ············else if ( t == typeof(ushort))
105 ················return NpgsqlDbType.Smallint;
106 ············else if ( t == typeof(int))
107 ················return NpgsqlDbType.Integer;
108 ············else if ( t == typeof(uint))
109 ················return NpgsqlDbType.Integer;
110 ············else if ( t == typeof(long))
111 ················return NpgsqlDbType.Bigint;
112 ············else if ( t == typeof(System.Guid))
113 ················return NpgsqlDbType.Char;
114 ············else if ( t == typeof(ulong))
115 ················return NpgsqlDbType.Bigint;
116 ············else if ( t == typeof(float))
117 ················return NpgsqlDbType.Real;
118 ············else if ( t == typeof(double))
119 ················return NpgsqlDbType.Double;
120 ············else if ( t == typeof(string))
121 ················return NpgsqlDbType.Varchar;
122 ············else if ( t == typeof(byte[]))
123 ················return NpgsqlDbType.Bytea;
124 ············else if ( t == typeof(decimal))
125 ················return NpgsqlDbType.Numeric;
126 ············else if ( t == typeof(System.DateTime))
127 ················return NpgsqlDbType.Date;
128 ············else if ( t.IsSubclassOf(typeof(System.Enum)))
129 ················return NpgsqlDbType.Integer;
130 ············else
131 ················throw new NDOException(27, "NDO.NpgsqlProvider.GetDbType: Typ " + t.Name + " kann nicht in NpgsqlDbType konvertiert werden");
132 ········}
133
134 ········// The following method converts string representations of NpgsqlDbType-Members
135 ········// into NpgsqlDbType.
136 ········// For your own adapter use members of the database type emumeration of your
137 ········// ADO.NET provider and convert it to the respective enumeration type········
138 ········public override object GetDbType(string typeName)
139 ········{
140 ············if (String.Compare(typeName, "bool", true) == 0)
141 ················return NpgsqlDbType.Boolean;
142 ············if (String.Compare(typeName, "int8", true) == 0)
143 ················return NpgsqlDbType.Bigint;
144 ············if (String.Compare(typeName, "bytea", true) == 0)
145 ················return NpgsqlDbType.Bytea;
146 ············if (String.Compare(typeName, "date", true) == 0)
147 ················return NpgsqlDbType.Date;
148 ············if (String.Compare(typeName, "float8", true) == 0)
149 ················return NpgsqlDbType.Double;
150 ············if (String.Compare(typeName, "int4", true) == 0)
151 ················return NpgsqlDbType.Integer;
152 ············if (String.Compare(typeName, "money", true) == 0)
153 ················return NpgsqlDbType.Money;
154 ············if (String.Compare(typeName, "numeric", true) == 0)
155 ················return NpgsqlDbType.Numeric;
156 ············if (String.Compare(typeName, "float4", true) == 0)
157 ················return NpgsqlDbType.Real;
158 ············if (String.Compare(typeName, "int2", true) == 0)
159 ················return NpgsqlDbType.Smallint;
160 ············if (String.Compare(typeName, "text", true) == 0)
161 ················return NpgsqlDbType.Text;
162 ············if (String.Compare(typeName, "time", true) == 0)
163 ················return NpgsqlDbType.Time;
164 ············if (String.Compare(typeName, "timestamp", true) == 0)
165 ················return NpgsqlDbType.Timestamp;
166 ············if (String.Compare(typeName, "timetz", true) == 0)
167 ················return NpgsqlDbType.Time;
168 ············if (String.Compare(typeName, "timestamptz", true) == 0)
169 ················return NpgsqlDbType.Timestamp;
170 ············if (String.Compare(typeName, "varchar", true) == 0)
171 ················return NpgsqlDbType.Varchar;
172 ············throw new NDOException(27, "NDONpgsql.Provider.GetDbType: Typname " + typeName + " kann nicht in NpgsqlDbType konvertiert werden");
173 ········}
174
175 ········private string GetDateExpression(System.DateTime dt)
176 ········{
177 ············//'9999-12-31 23:59:59'
178 ············return "'" + dt.ToString("yyyy-MM-dd HH:mm:ss") + "'";
179 ········}
180 ····
181
182 ········public override int GetDefaultLength(System.Type t)
183 ········{
184 ············t = base.ConvertNullableType(t);
185 ············if (t == typeof(bool))
186 ················return 1;
187 ············else if ( t == typeof(byte) )
188 ················return 2;
189 ············else if ( t == typeof(sbyte) )
190 ················return 2;
191 ············else if ( t == typeof(char) )
192 ················return 2;
193 ············else if ( t == typeof(short))
194 ················return 2;
195 ············else if ( t == typeof(ushort))
196 ················return 2;
197 ············else if ( t == typeof(int))
198 ················return 4;
199 ············else if ( t == typeof(uint))
200 ················return 4;
201 ············else if ( t == typeof(long))
202 ················return 8;
203 ············else if ( t == typeof(System.Guid))
204 ················return 36;
205 ············else if ( t == typeof(ulong))
206 ················return 8;
207 ············else if ( t == typeof(float))
208 ················return 4;
209 ············else if ( t == typeof(double))
210 ················return 8;
211 ············else if ( t == typeof(string))
212 ················return 255;
213 ············else if ( t == typeof(byte[]))
214 ················return 255;
215 ············else if ( t == typeof(decimal))
216 ················return 18;
217 ············else if ( t == typeof(System.DateTime))
218 ················return 16;
219 ············else if ( t.IsSubclassOf(typeof(System.Enum)))
220 ················return 4;
221 ············else
222 ················return 0;········
223 ········}
224
225 ········public override string GetDbTypeString( IDbDataParameter parameter )
226 ········{
227 ············return (((NpgsqlParameter)parameter).NpgsqlDbType).ToString();
228 ········}
229
230 ········public override string Wildcard
231 ········{
232 ············get { return "%"; }
233 ········}
234
235 ········public override bool UseNamedParams
236 ········{
237 ············get { return true; }
238 ········}
239
240 /*
241 ········public override bool UseStoredProcedure
242 ········{
243 ············get { return false; }
244 ········}
245 */
246 ········#endregion
247 ········
248 ········//private Hashtable namedParameters = new Hashtable();
249 ········public override string GetNamedParameter(string plainParameterName)
250 ········{
251 ············return ":" + plainParameterName;
252 ········}
253 ····
254 ········public override string GetQuotedName(string plainName)
255 ········{
256 ············return "\"" + plainName + '"';
257 ········}
258 ····
259 ········public override string GetSqlLiteral(object o)
260 ········{
261 ············if (o is DateTime)
262 ················return this.GetDateExpression((DateTime)o);
263 ············return base.GetSqlLiteral (o);
264 ········}
265 ········
266
267 ········/// <summary>
268 ········/// Indicates whether the last automatically generated ID can be retrieved.
269 ········/// Returns true if a database provides automatically incremented IDs and its syntax has an expression
270 ········/// which retrieves the last generated ID; otherwise false.
271 ········/// </summary>
272 ········public override bool SupportsLastInsertedId
273 ········{
274 ············get { return false; }
275 ········}
276
277
278 ········/// <summary>
279 ········/// Gets an expression in the SQL dialect of the database, which retrieves the ID of the last
280 ········/// inserted row, if the ID is automatically generated by the database.
281 ········/// </summary>
282 ········public override string GetLastInsertedId(string tableName, string columnName)
283 ········{
284 ············return null;
285 ········}
286
287 ········/// <summary>
288 ········/// Determines whether a database supports bulk command strings.
289 ········/// </summary>
290 ········public override bool SupportsBulkCommands
291 ········{
292 ············get { return true; }
293 ········}
294 ········
295
296 ········/// <summary>
297 ········/// Generate one big command string out of several partial commands to save roundtrips
298 ········/// to the server.
299 ········/// </summary>
300 ········/// <param name="commands"></param>
301 ········/// <returns></returns>
302 ········public override string GenerateBulkCommand(string[] commands)
303 ········{
304 ············StringBuilder sb = new StringBuilder(commands.Length * 100);
305 ············foreach (string s in commands)
306 ············{
307 ················sb.Append(s);
308 ················sb.Append(';');
309 ············}
310 ············return sb.ToString();
311 ········}
312
313 ············
314 ········public override string[] GetTableNames(IDbConnection conn, string owner)
315 ········{
316 ············NpgsqlDataAdapter a = new NpgsqlDataAdapter("Select * from pg_tables", (NpgsqlConnection)conn);
317 ············DataSet ds = new DataSet();
318 ············a.Fill(ds);
319 ············DataTable dt = ds.Tables[0];
320 ············ArrayList al = new ArrayList();
321 ············bool hasOwner = (owner != null || owner != "");
322 ············foreach (DataRow dr in dt.Rows)
323 ············{
324 ················string sname = (string) dr["schemaname"];
325 ················if (sname == "information_schema")
326 ····················continue;
327 ················if (sname == "pg_catalog")
328 ····················continue;
329 ················if (hasOwner && sname != owner)
330 ····················continue;
331 ····················
332 ················al.Add(dr["tablename"]);
333 ············}
334 ············string[] strresult = new string[al.Count];
335 ············for (int i = 0; i < al.Count; i++)
336 ················strresult[i] = (string) al[i];
337 ············return strresult;
338 ········}
339 ····
340 ········public override string[] TypeNames
341 ········{
342 ············get
343 ············{················
344 ················return Enum.GetNames(typeof(NpgsqlDbType));
345 ············}
346 ········}
347
348 ········public override string Name { get { return "Postgre"; }··}
349
350 ········public override bool SupportsInsertBatch
351 ········{
352 ············get
353 ············{
354 ················return true;
355 ············}
356 ········}
357
358 ········public override bool SupportsNativeGuidType
359 ········{
360 ············get { return false; }
361 ········}
362
363 ········/// <summary>
364 ········/// Creates a Database
365 ········/// </summary>
366 ········/// <param name="databaseName">The name of the new database</param>
367 ········/// <param name="connectionString">The connection string used to create the database</param>
368 ········/// <param name="additionalData">Not used</param>
369 ········/// <returns></returns>
370 ········public override string CreateDatabase(string databaseName, string connectionString, object additionalData)
371 ········{
372 ············base.CreateDatabase (databaseName, connectionString, additionalData);
373
374 ············// We have to construct a connectionString
375 ············// containing the database name
376
377 ············// If somebody has provided a connection string containing the name of an existing database
378 ············// replace it with the name of the new database.
379 ············Regex regex = new Regex(@"Database\s*=([^\;]*)");
380 ············Match match = regex.Match(connectionString);
381 ············if (match.Success)
382 ············{
383 ················return connectionString.Substring(0, match.Groups[1].Index) + databaseName + connectionString.Substring(match.Index + match.Length);
384 ············}
385 ············
386 ············// Add the name of the new database to the connection string.
387 ············if (!connectionString.EndsWith(";"))
388 ················connectionString = connectionString + ";";
389 ············
390 ············return connectionString + "Database=" + databaseName;
391 ········}
392 ····}
393 }
394
New Commit (273289e)
1 //
2 // Copyright (c) 2002-2016 Mirko Matytschak
3 // (www.netdataobjects.de)
4 //
5 // Author: Mirko Matytschak
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
8 // documentation files (the "Software"), to deal in the Software without restriction, including without limitation
9 // the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
10 // Software, and to permit persons to whom the Software is furnished to do so, subject to the following
11 // conditions:
12
13 // The above copyright notice and this permission notice shall be included in all copies or substantial portions
14 // of the Software.
15 //
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
17 // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
19 // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20 // DEALINGS IN THE SOFTWARE.
21
22
23 using System;
24 using System.Text;
25 using System.Text.RegularExpressions;
26 using System.Data;
27 using System.Data.Common;
28 using NDOInterfaces;
29 using System.Collections;
30 using Npgsql;
31 using NpgsqlTypes;
32
33 namespace NDO.PostGreProvider
34 {
35 ····/// <summary>
36 ····/// Sample adapter class to connect new ADO.NET Providers with NDO.
37 ····/// This Adapter is based on the Npgsql Npgsql Data Connector
38 ····/// </summary>
39 ····public class Provider : NDOAbstractProvider
40 ····{
41 ········// The following methods provide objects of provider classes
42 ········// which implement common interfaces in .NET:
43 ········// IDbConnection, IDbCommand, DbDataAdapter and the Parameter objects
44 ········#region Provide specialized type objects
45 ········public override System.Data.IDbConnection NewConnection(string connectionString)
46 ········{
47 ············return new NpgsqlConnection(connectionString);
48 ········}
49
50 ········public override System.Data.IDbCommand NewSqlCommand(System.Data.IDbConnection connection)
51 ········{
52 ············NpgsqlCommand command = new NpgsqlCommand();
53 ············command.Connection = (NpgsqlConnection)connection;
54 ············return command;
55 ········}
56
57 ········public override DbDataAdapter NewDataAdapter(System.Data.IDbCommand select, System.Data.IDbCommand update, System.Data.IDbCommand insert, System.Data.IDbCommand delete)
58 ········{
59 ············NpgsqlDataAdapter da = new NpgsqlDataAdapter();
60 ············da.SelectCommand = (NpgsqlCommand)select;
61 ············da.UpdateCommand = (NpgsqlCommand)update;
62 ············da.InsertCommand = (NpgsqlCommand)insert;
63 ············da.DeleteCommand = (NpgsqlCommand)delete;
64 ············return da;
65 ········}
66
67 ········/// <summary>
68 ········/// See <see cref="IProvider"> IProvider interface </see>
69 ········/// </summary>
70 ········public override object NewCommandBuilder(DbDataAdapter dataAdapter)
71 ········{
72 ············return new NpgsqlCommandBuilder((NpgsqlDataAdapter)dataAdapter);
73 ········}
74
75
76 ········public override IDataParameter AddParameter(System.Data.IDbCommand command, string parameterName, object dbType, int size, string columnName)
77 ········{
78 ············return ((NpgsqlCommand)command).Parameters.Add(new NpgsqlParameter(parameterName, (NpgsqlDbType)dbType, size, columnName));············
79 ········}
80
81 ········public override IDataParameter AddParameter(IDbCommand command, string parameterName, object dbType, int size, ParameterDirection dir, bool isNullable, byte precision, byte scale, string srcColumn, DataRowVersion srcVersion, object value)
82 ········{
83 ············return ((NpgsqlCommand)command).Parameters.Add(new NpgsqlParameter(parameterName, (NpgsqlDbType)dbType, size, srcColumn, dir, isNullable, precision, scale, srcVersion, value));
84 ········}
85 ········#endregion
86
87 ········// The following method convert System.Type objects to NpgsqlDbType-Members
88 ········// For your own adapter use members of the database type emumeration
89 ········// of your ADO.NET provider
90 ········#region Provide NpgsqlDbType members
91 ········public override object GetDbType(Type t)
92 ········{
93 ············t = base.ConvertNullableType(t);
94 ············if (t == typeof(bool))
95 ················return NpgsqlDbType.Boolean;
96 ············else if ( t == typeof(byte) )
97 ················return NpgsqlDbType.Smallint;
98 ············else if ( t == typeof(sbyte) )
99 ················return NpgsqlDbType.Smallint;
100 ············else if ( t == typeof(char) )
101 ················return NpgsqlDbType.Smallint;
102 ············else if ( t == typeof(short))
103 ················return NpgsqlDbType.Smallint;
104 ············else if ( t == typeof(ushort))
105 ················return NpgsqlDbType.Smallint;
106 ············else if ( t == typeof(int))
107 ················return NpgsqlDbType.Integer;
108 ············else if ( t == typeof(uint))
109 ················return NpgsqlDbType.Integer;
110 ············else if ( t == typeof(long))
111 ················return NpgsqlDbType.Bigint;
112 ············else if ( t == typeof(System.Guid))
113 ················return NpgsqlDbType.Char;
114 ············else if ( t == typeof(ulong))
115 ················return NpgsqlDbType.Bigint;
116 ············else if ( t == typeof(float))
117 ················return NpgsqlDbType.Real;
118 ············else if ( t == typeof(double))
119 ················return NpgsqlDbType.Double;
120 ············else if ( t == typeof(string))
121 ················return NpgsqlDbType.Varchar;
122 ············else if ( t == typeof(byte[]))
123 ················return NpgsqlDbType.Bytea;
124 ············else if ( t == typeof(decimal))
125 ················return NpgsqlDbType.Numeric;
126 ············else if ( t == typeof(System.DateTime))
127 ················return NpgsqlDbType.Date;
128 ············else if ( t.IsSubclassOf(typeof(System.Enum)))
129 ················return NpgsqlDbType.Integer;
130 ············else
131 ················throw new NDOException(27, "NDO.NpgsqlProvider.GetDbType: Typ " + t.Name + " kann nicht in NpgsqlDbType konvertiert werden");
132 ········}
133
134 ········// The following method converts string representations of NpgsqlDbType-Members
135 ········// into NpgsqlDbType.
136 ········// For your own adapter use members of the database type emumeration of your
137 ········// ADO.NET provider and convert it to the respective enumeration type········
138 ········public override object GetDbType(string typeName)
139 ········{
140 ············if (String.Compare(typeName, "bool", true) == 0)
141 ················return NpgsqlDbType.Boolean;
142 ············if (String.Compare(typeName, "int8", true) == 0)
143 ················return NpgsqlDbType.Bigint;
144 ············if (String.Compare(typeName, "bytea", true) == 0)
145 ················return NpgsqlDbType.Bytea;
146 ············if (String.Compare(typeName, "date", true) == 0)
147 ················return NpgsqlDbType.Date;
148 ············if (String.Compare(typeName, "float8", true) == 0)
149 ················return NpgsqlDbType.Double;
150 ············if (String.Compare(typeName, "int4", true) == 0)
151 ················return NpgsqlDbType.Integer;
152 ············if (String.Compare(typeName, "money", true) == 0)
153 ················return NpgsqlDbType.Money;
154 ············if (String.Compare(typeName, "numeric", true) == 0)
155 ················return NpgsqlDbType.Numeric;
156 ············if (String.Compare(typeName, "float4", true) == 0)
157 ················return NpgsqlDbType.Real;
158 ············if (String.Compare(typeName, "int2", true) == 0)
159 ················return NpgsqlDbType.Smallint;
160 ············if (String.Compare(typeName, "text", true) == 0)
161 ················return NpgsqlDbType.Text;
162 ············if (String.Compare(typeName, "time", true) == 0)
163 ················return NpgsqlDbType.Time;
164 ············if (String.Compare(typeName, "timestamp", true) == 0)
165 ················return NpgsqlDbType.Timestamp;
166 ············if (String.Compare(typeName, "timetz", true) == 0)
167 ················return NpgsqlDbType.Time;
168 ············if (String.Compare(typeName, "timestamptz", true) == 0)
169 ················return NpgsqlDbType.Timestamp;
170 ············if (String.Compare(typeName, "varchar", true) == 0)
171 ················return NpgsqlDbType.Varchar;
172 ············throw new NDOException(27, "NDONpgsql.Provider.GetDbType: Typname " + typeName + " kann nicht in NpgsqlDbType konvertiert werden");
173 ········}
174
 
 
 
 
 
175
 
176 ········public override int GetDefaultLength(System.Type t)
177 ········{
178 ············t = base.ConvertNullableType(t);
179 ············if (t == typeof(bool))
180 ················return 1;
181 ············else if ( t == typeof(byte) )
182 ················return 2;
183 ············else if ( t == typeof(sbyte) )
184 ················return 2;
185 ············else if ( t == typeof(char) )
186 ················return 2;
187 ············else if ( t == typeof(short))
188 ················return 2;
189 ············else if ( t == typeof(ushort))
190 ················return 2;
191 ············else if ( t == typeof(int))
192 ················return 4;
193 ············else if ( t == typeof(uint))
194 ················return 4;
195 ············else if ( t == typeof(long))
196 ················return 8;
197 ············else if ( t == typeof(System.Guid))
198 ················return 36;
199 ············else if ( t == typeof(ulong))
200 ················return 8;
201 ············else if ( t == typeof(float))
202 ················return 4;
203 ············else if ( t == typeof(double))
204 ················return 8;
205 ············else if ( t == typeof(string))
206 ················return 255;
207 ············else if ( t == typeof(byte[]))
208 ················return 255;
209 ············else if ( t == typeof(decimal))
210 ················return 18;
211 ············else if ( t == typeof(System.DateTime))
212 ················return 16;
213 ············else if ( t.IsSubclassOf(typeof(System.Enum)))
214 ················return 4;
215 ············else
216 ················return 0;········
217 ········}
218
219 ········public override string GetDbTypeString( IDbDataParameter parameter )
220 ········{
221 ············return (((NpgsqlParameter)parameter).NpgsqlDbType).ToString();
222 ········}
223
224 ········public override string Wildcard
225 ········{
226 ············get { return "%"; }
227 ········}
228
229 ········public override bool UseNamedParams
230 ········{
231 ············get { return true; }
232 ········}
233
234 /*
235 ········public override bool UseStoredProcedure
236 ········{
237 ············get { return false; }
238 ········}
239 */
240 ········#endregion
241 ········
242 ········//private Hashtable namedParameters = new Hashtable();
243 ········public override string GetNamedParameter(string plainParameterName)
244 ········{
245 ············return ":" + plainParameterName;
246 ········}
247 ····
248 ········public override string GetQuotedName(string plainName)
249 ········{
250 ············return "\"" + plainName + '"';
 
 
 
 
 
 
 
251 ········}········
 
252
253 ········/// <summary>
254 ········/// Indicates whether the last automatically generated ID can be retrieved.
255 ········/// Returns true if a database provides automatically incremented IDs and its syntax has an expression
256 ········/// which retrieves the last generated ID; otherwise false.
257 ········/// </summary>
258 ········public override bool SupportsLastInsertedId
259 ········{
260 ············get { return false; }
261 ········}
262
263
264 ········/// <summary>
265 ········/// Gets an expression in the SQL dialect of the database, which retrieves the ID of the last
266 ········/// inserted row, if the ID is automatically generated by the database.
267 ········/// </summary>
268 ········public override string GetLastInsertedId(string tableName, string columnName)
269 ········{
270 ············return null;
271 ········}
272
273 ········/// <summary>
274 ········/// Determines whether a database supports bulk command strings.
275 ········/// </summary>
276 ········public override bool SupportsBulkCommands
277 ········{
278 ············get { return true; }
279 ········}
280 ········
281
282 ········/// <summary>
283 ········/// Generate one big command string out of several partial commands to save roundtrips
284 ········/// to the server.
285 ········/// </summary>
286 ········/// <param name="commands"></param>
287 ········/// <returns></returns>
288 ········public override string GenerateBulkCommand(string[] commands)
289 ········{
290 ············StringBuilder sb = new StringBuilder(commands.Length * 100);
291 ············foreach (string s in commands)
292 ············{
293 ················sb.Append(s);
294 ················sb.Append(';');
295 ············}
296 ············return sb.ToString();
297 ········}
298
299 ············
300 ········public override string[] GetTableNames(IDbConnection conn, string owner)
301 ········{
302 ············NpgsqlDataAdapter a = new NpgsqlDataAdapter("Select * from pg_tables", (NpgsqlConnection)conn);
303 ············DataSet ds = new DataSet();
304 ············a.Fill(ds);
305 ············DataTable dt = ds.Tables[0];
306 ············ArrayList al = new ArrayList();
307 ············bool hasOwner = (owner != null || owner != "");
308 ············foreach (DataRow dr in dt.Rows)
309 ············{
310 ················string sname = (string) dr["schemaname"];
311 ················if (sname == "information_schema")
312 ····················continue;
313 ················if (sname == "pg_catalog")
314 ····················continue;
315 ················if (hasOwner && sname != owner)
316 ····················continue;
317 ····················
318 ················al.Add(dr["tablename"]);
319 ············}
320 ············string[] strresult = new string[al.Count];
321 ············for (int i = 0; i < al.Count; i++)
322 ················strresult[i] = (string) al[i];
323 ············return strresult;
324 ········}
325 ····
326 ········public override string[] TypeNames
327 ········{
328 ············get
329 ············{················
330 ················return Enum.GetNames(typeof(NpgsqlDbType));
331 ············}
332 ········}
333
334 ········public override string Name { get { return "Postgre"; }··}
335
336 ········public override bool SupportsInsertBatch
337 ········{
338 ············get
339 ············{
340 ················return true;
341 ············}
342 ········}
343
344 ········public override bool SupportsNativeGuidType
345 ········{
346 ············get { return false; }
347 ········}
348
349 ········/// <summary>
350 ········/// Creates a Database
351 ········/// </summary>
352 ········/// <param name="databaseName">The name of the new database</param>
353 ········/// <param name="connectionString">The connection string used to create the database</param>
354 ········/// <param name="additionalData">Not used</param>
355 ········/// <returns></returns>
356 ········public override string CreateDatabase(string databaseName, string connectionString, object additionalData)
357 ········{
358 ············base.CreateDatabase (databaseName, connectionString, additionalData);
359
360 ············// We have to construct a connectionString
361 ············// containing the database name
362
363 ············// If somebody has provided a connection string containing the name of an existing database
364 ············// replace it with the name of the new database.
365 ············Regex regex = new Regex(@"Database\s*=([^\;]*)");
366 ············Match match = regex.Match(connectionString);
367 ············if (match.Success)
368 ············{
369 ················return connectionString.Substring(0, match.Groups[1].Index) + databaseName + connectionString.Substring(match.Index + match.Length);
370 ············}
371 ············
372 ············// Add the name of the new database to the connection string.
373 ············if (!connectionString.EndsWith(";"))
374 ················connectionString = connectionString + ";";
375 ············
376 ············return connectionString + "Database=" + databaseName;
377 ········}
378 ····}
379 }
380