X Tutup
// NpgsqlTypes.NpgsqlTypeMappings.cs // // Author: // Francisco Jr. (fxjrlists@yahoo.com.br) // // Copyright (C) 2002 The Npgsql Development Team // npgsql-general@gborg.postgresql.org // http://gborg.postgresql.org/project/npgsql/projdisplay.php // // Permission to use, copy, modify, and distribute this software and its // documentation for any purpose, without fee, and without a written // agreement is hereby granted, provided that the above copyright notice // and this paragraph and the following two paragraphs appear in all copies. // // IN NO EVENT SHALL THE NPGSQL DEVELOPMENT TEAM BE LIABLE TO ANY PARTY // FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, // INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS // DOCUMENTATION, EVEN IF THE NPGSQL DEVELOPMENT TEAM HAS BEEN ADVISED OF // THE POSSIBILITY OF SUCH DAMAGE. // // THE NPGSQL DEVELOPMENT TEAM SPECIFICALLY DISCLAIMS ANY WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY // AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS // ON AN "AS IS" BASIS, AND THE NPGSQL DEVELOPMENT TEAM HAS NO OBLIGATIONS // TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. using System; using System.Collections.Generic; using System.Data; using System.Globalization; using System.Net; using System.Net.NetworkInformation; using System.Reflection; using System.Resources; using System.Text; using System.IO; using Npgsql; namespace NpgsqlTypes { /// /// Provide mapping between type OID, type name, and a NpgsqlBackendTypeInfo object that represents it. /// internal class NpgsqlBackendTypeMapping { private readonly Dictionary OIDIndex; private readonly Dictionary NameIndex; /// /// Construct an empty mapping. /// public NpgsqlBackendTypeMapping() { OIDIndex = new Dictionary(); NameIndex = new Dictionary(); } /// /// Copy constuctor. /// private NpgsqlBackendTypeMapping(NpgsqlBackendTypeMapping Other) { OIDIndex = new Dictionary(Other.OIDIndex); NameIndex = new Dictionary(Other.NameIndex); } /// /// Add the given NpgsqlBackendTypeInfo to this mapping. /// public void AddType(NpgsqlBackendTypeInfo T) { if (OIDIndex.ContainsKey(T.OID)) { throw new Exception("Type already mapped"); } OIDIndex[T.OID] = T; NameIndex[T.Name] = T; } /// /// Add a new NpgsqlBackendTypeInfo with the given attributes and conversion handlers to this mapping. /// /// Type OID provided by the backend server. /// Type name provided by the backend server. /// NpgsqlDbType /// DbType /// System type to convert fields of this type to. /// Data conversion handler for text encoding. /// Data conversion handler for binary data. public void AddType(Int32 OID, String Name, NpgsqlDbType NpgsqlDbType, DbType DbType, Type Type, ConvertBackendTextToNativeHandler BackendTextConvert = null, ConvertBackendBinaryToNativeHandler BackendBinaryConvert = null) { AddType(new NpgsqlBackendTypeInfo(OID, Name, NpgsqlDbType, DbType, Type, BackendTextConvert = null, BackendBinaryConvert = null)); } /// /// Get the number of type infos held. /// public Int32 Count { get { return NameIndex.Count; } } public bool TryGetValue(int oid, out NpgsqlBackendTypeInfo value) { return OIDIndex.TryGetValue(oid, out value); } /// /// Retrieve the NpgsqlBackendTypeInfo with the given backend type OID, or null if none found. /// public NpgsqlBackendTypeInfo this[Int32 OID] { get { NpgsqlBackendTypeInfo ret = null; return TryGetValue(OID, out ret) ? ret : null; } } /// /// Retrieve the NpgsqlBackendTypeInfo with the given backend type name, or null if none found. /// public NpgsqlBackendTypeInfo this[String Name] { get { NpgsqlBackendTypeInfo ret = null; return NameIndex.TryGetValue(Name, out ret) ? ret : null; } } /// /// Make a shallow copy of this type mapping. /// public NpgsqlBackendTypeMapping Clone() { return new NpgsqlBackendTypeMapping(this); } /// /// Determine if a NpgsqlBackendTypeInfo with the given backend type OID exists in this mapping. /// public Boolean ContainsOID(Int32 OID) { return OIDIndex.ContainsKey(OID); } /// /// Determine if a NpgsqlBackendTypeInfo with the given backend type name exists in this mapping. /// public Boolean ContainsName(String Name) { return NameIndex.ContainsKey(Name); } } /// /// Provide mapping between type Type, NpgsqlDbType and a NpgsqlNativeTypeInfo object that represents it. /// internal class NpgsqlNativeTypeMapping { private readonly Dictionary NameIndex = new Dictionary(); private readonly Dictionary NpgsqlDbTypeIndex = new Dictionary(); private readonly Dictionary DbTypeIndex = new Dictionary(); private readonly Dictionary TypeIndex = new Dictionary(); /// /// Add the given NpgsqlNativeTypeInfo to this mapping. /// public void AddType(NpgsqlNativeTypeInfo T) { if (NameIndex.ContainsKey(T.Name)) { throw new Exception("Type already mapped"); } NameIndex[T.Name] = T; NpgsqlDbTypeIndex[T.NpgsqlDbType] = T; DbTypeIndex[T.DbType] = T; if (!T.IsArray) { NpgsqlNativeTypeInfo arrayType = NpgsqlNativeTypeInfo.ArrayOf(T); NameIndex[arrayType.Name] = arrayType; NameIndex[arrayType.CastName] = arrayType; NpgsqlDbTypeIndex[arrayType.NpgsqlDbType] = arrayType; } } /// /// Add a new NpgsqlNativeTypeInfo with the given attributes and conversion handlers to this mapping. /// /// Type name provided by the backend server. /// NpgsqlDbType /// DbType /// Quote /// Data conversion handler for text backend encoding. /// Data conversion handler for binary backend encoding (for extended query). public void AddType(String Name, NpgsqlDbType NpgsqlDbType, DbType DbType, Boolean Quote, ConvertNativeToBackendTextHandler NativeTextConvert = null, ConvertNativeToBackendBinaryHandler NativeBinaryConvert = null) { AddType(new NpgsqlNativeTypeInfo(Name, NpgsqlDbType, DbType, Quote, NativeTextConvert, NativeBinaryConvert)); } public void AddNpgsqlDbTypeAlias(String Name, NpgsqlDbType NpgsqlDbType) { if (NpgsqlDbTypeIndex.ContainsKey(NpgsqlDbType)) { throw new Exception("NpgsqlDbType already aliased"); } NpgsqlDbTypeIndex[NpgsqlDbType] = NameIndex[Name]; } public void AddDbTypeAlias(String Name, DbType DbType) { /*if (DbTypeIndex.ContainsKey(DbType)) { throw new Exception("DbType already aliased"); }*/ DbTypeIndex[DbType] = NameIndex[Name]; } public void AddTypeAlias(String Name, Type Type) { if (TypeIndex.ContainsKey(Type)) { throw new Exception("Type already aliased"); } TypeIndex[Type] = NameIndex[Name]; } /// /// Get the number of type infos held. /// public Int32 Count { get { return NameIndex.Count; } } public bool TryGetValue(string name, out NpgsqlNativeTypeInfo typeInfo) { return NameIndex.TryGetValue(name, out typeInfo); } /// /// Retrieve the NpgsqlNativeTypeInfo with the given NpgsqlDbType. /// public bool TryGetValue(NpgsqlDbType dbType, out NpgsqlNativeTypeInfo typeInfo) { return NpgsqlDbTypeIndex.TryGetValue(dbType, out typeInfo); } /// /// Retrieve the NpgsqlNativeTypeInfo with the given DbType. /// public bool TryGetValue(DbType dbType, out NpgsqlNativeTypeInfo typeInfo) { return DbTypeIndex.TryGetValue(dbType, out typeInfo); } /// /// Retrieve the NpgsqlNativeTypeInfo with the given Type. /// public bool TryGetValue(Type type, out NpgsqlNativeTypeInfo typeInfo) { return TypeIndex.TryGetValue(type, out typeInfo); } /// /// Determine if a NpgsqlNativeTypeInfo with the given backend type name exists in this mapping. /// public Boolean ContainsName(String Name) { return NameIndex.ContainsKey(Name); } /// /// Determine if a NpgsqlNativeTypeInfo with the given NpgsqlDbType exists in this mapping. /// public Boolean ContainsNpgsqlDbType(NpgsqlDbType NpgsqlDbType) { return NpgsqlDbTypeIndex.ContainsKey(NpgsqlDbType); } /// /// Determine if a NpgsqlNativeTypeInfo with the given Type name exists in this mapping. /// public Boolean ContainsType(Type Type) { return TypeIndex.ContainsKey(Type); } } }
X Tutup