From: <jul...@us...> - 2011-03-30 01:50:38
|
Revision: 5569 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5569&view=rev Author: julian-maughan Date: 2011-03-30 01:50:31 +0000 (Wed, 30 Mar 2011) Log Message: ----------- Added PostgreSQL metadata provider (NH-2426) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/PostgreSQLDialect.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Dialect/Schema/PostgreSQLMetadata.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/PostgreSQLDialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/PostgreSQLDialect.cs 2011-03-29 14:23:44 UTC (rev 5568) +++ trunk/nhibernate/src/NHibernate/Dialect/PostgreSQLDialect.cs 2011-03-30 01:50:31 UTC (rev 5569) @@ -1,6 +1,8 @@ using System.Data; +using System.Data.Common; using NHibernate.Cfg; using NHibernate.Dialect.Function; +using NHibernate.Dialect.Schema; using NHibernate.SqlCommand; using NHibernate.SqlTypes; @@ -12,21 +14,22 @@ /// <remarks> /// The PostgreSQLDialect defaults the following configuration properties: /// <list type="table"> - /// <listheader> - /// <term>Property</term> - /// <description>Default Value</description> - /// </listheader> - /// <item> - /// <term>connection.driver_class</term> - /// <description><see cref="NHibernate.Driver.NpgsqlDriver" /></description> - /// </item> + /// <listheader> + /// <term>Property</term> + /// <description>Default Value</description> + /// </listheader> + /// <item> + /// <term>connection.driver_class</term> + /// <description><see cref="NHibernate.Driver.NpgsqlDriver" /></description> + /// </item> /// </list> /// </remarks> public class PostgreSQLDialect : Dialect { - /// <summary></summary> public PostgreSQLDialect() { + DefaultProperties[Environment.ConnectionDriver] = "NHibernate.Driver.NpgsqlDriver"; + RegisterColumnType(DbType.AnsiStringFixedLength, "char(255)"); RegisterColumnType(DbType.AnsiStringFixedLength, 8000, "char($l)"); RegisterColumnType(DbType.AnsiString, "varchar(255)"); @@ -51,7 +54,7 @@ RegisterColumnType(DbType.StringFixedLength, 4000, "char($l)"); RegisterColumnType(DbType.String, "varchar(255)"); RegisterColumnType(DbType.String, 4000, "varchar($l)"); - RegisterColumnType(DbType.String, 1073741823, "text"); // + RegisterColumnType(DbType.String, 1073741823, "text"); RegisterColumnType(DbType.Time, "time"); // Override standard HQL function @@ -59,23 +62,17 @@ RegisterFunction("str", new SQLFunctionTemplate(NHibernateUtil.String, "cast(?1 as varchar)")); RegisterFunction("locate", new PositionSubstringFunction()); RegisterFunction("iif", new SQLFunctionTemplate(null, "case when ?1 then ?2 else ?3 end")); - RegisterFunction("substring", new AnsiSubstringFunction()); RegisterFunction("replace", new StandardSQLFunction("replace", NHibernateUtil.String)); RegisterFunction("left", new SQLFunctionTemplate(NHibernateUtil.String, "substr(?1,1,?2)")); - RegisterFunction("mod", new SQLFunctionTemplate(NHibernateUtil.Int32, "((?1) % (?2))")); - - DefaultProperties[Environment.ConnectionDriver] = "NHibernate.Driver.NpgsqlDriver"; } - /// <summary></summary> public override string AddColumnString { get { return "add column"; } } - /// <summary></summary> public override bool DropConstraints { get { return false; } @@ -111,10 +108,10 @@ return insertString.Append(" returning " + identifierColumnName); } - public override InsertGeneratedIdentifierRetrievalMethod InsertGeneratedIdentifierRetrievalMethod - { - get { return InsertGeneratedIdentifierRetrievalMethod.OutputParameter; } - } + public override InsertGeneratedIdentifierRetrievalMethod InsertGeneratedIdentifierRetrievalMethod + { + get { return InsertGeneratedIdentifierRetrievalMethod.OutputParameter; } + } public override bool SupportsSequences { @@ -192,13 +189,6 @@ get { return true; } } - /*public override bool DropTemporaryTableAfterUse() - { - //we have to, because postgres sets current tx - //to rollback only after a failed create table - return true; - }*/ - public override string CreateTemporaryTableString { get { return "create temporary table"; } @@ -206,10 +196,7 @@ public override string CreateTemporaryTablePostfix { - get - { - return "on commit drop"; - } + get { return "on commit drop"; } } public override string ToBooleanValueString(bool value) @@ -217,9 +204,14 @@ return value ? "TRUE" : "FALSE"; } - public override string SelectGUIDString - { - get { return "select uuid_generate_v4()"; } - } + public override string SelectGUIDString + { + get { return "select uuid_generate_v4()"; } + } + + public override IDataBaseSchema GetDataBaseSchema(DbConnection connection) + { + return new PostgreSQLDataBaseMetadata(connection); + } } } Added: trunk/nhibernate/src/NHibernate/Dialect/Schema/PostgreSQLMetadata.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Schema/PostgreSQLMetadata.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Dialect/Schema/PostgreSQLMetadata.cs 2011-03-30 01:50:31 UTC (rev 5569) @@ -0,0 +1,110 @@ +using System; +using System.Data; +using System.Data.Common; +using Iesi.Collections.Generic; + +namespace NHibernate.Dialect.Schema +{ + public class PostgreSQLDataBaseMetadata : AbstractDataBaseSchema + { + public PostgreSQLDataBaseMetadata(DbConnection connection) : base(connection) {} + + public override ITableMetadata GetTableMetadata(DataRow rs, bool extras) + { + return new PostgreSQLTableMetadata(rs, this, extras); + } + + public override ISet<string> GetReservedWords() + { + // NpgsqlDriver does not currently (2011/03/30) support this feature, so the + // base class implementation has to be overriden + return new HashedSet<string>(); + } + } + + public class PostgreSQLTableMetadata : AbstractTableMetadata + { + public PostgreSQLTableMetadata(DataRow rs, IDataBaseSchema meta, bool extras) : base(rs, meta, extras) {} + + protected override IColumnMetadata GetColumnMetadata(DataRow rs) + { + return new PostgreSQLColumnMetadata(rs); + } + + protected override string GetColumnName(DataRow rs) + { + return Convert.ToString(rs["COLUMN_NAME"]); + } + + protected override string GetConstraintName(DataRow rs) + { + throw new NotImplementedException(); + } + + protected override IForeignKeyMetadata GetForeignKeyMetadata(DataRow rs) + { + return new PostgreSQLForeignKeyMetadata(rs); + } + + protected override IIndexMetadata GetIndexMetadata(DataRow rs) + { + return new PostgreSQLIndexMetadata(rs); + } + + protected override string GetIndexName(DataRow rs) + { + return Convert.ToString(rs["INDEX_NAME"]); + } + + protected override void ParseTableInfo(DataRow rs) + { + Catalog = Convert.ToString(rs["TABLE_CATALOG"]); + Schema = Convert.ToString(rs["TABLE_SCHEMA"]); + if (string.IsNullOrEmpty(Catalog)) + { + Catalog = null; + } + if (string.IsNullOrEmpty(Schema)) + { + Schema = null; + } + Name = Convert.ToString(rs["TABLE_NAME"]); + } + } + + public class PostgreSQLColumnMetadata : AbstractColumnMetaData + { + public PostgreSQLColumnMetadata(DataRow rs) : base(rs) + { + Name = Convert.ToString(rs["COLUMN_NAME"]); + object objValue = rs["CHARACTER_MAXIMUM_LENGTH"]; + if (objValue != DBNull.Value) + { + ColumnSize = Convert.ToInt32(objValue); + } + objValue = rs["NUMERIC_PRECISION"]; + if (objValue != DBNull.Value) + { + NumericalPrecision = Convert.ToInt32(objValue); + } + Nullable = Convert.ToString(rs["IS_NULLABLE"]); + TypeName = Convert.ToString(rs["DATA_TYPE"]); + } + } + + public class PostgreSQLIndexMetadata : AbstractIndexMetadata + { + public PostgreSQLIndexMetadata(DataRow rs) : base(rs) + { + Name = Convert.ToString(rs["INDEX_NAME"]); + } + } + + public class PostgreSQLForeignKeyMetadata : AbstractForeignKeyMetadata + { + public PostgreSQLForeignKeyMetadata(DataRow rs) : base(rs) + { + Name = Convert.ToString(rs["CONSTRAINT_NAME"]); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-03-29 14:23:44 UTC (rev 5568) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-03-30 01:50:31 UTC (rev 5569) @@ -138,6 +138,7 @@ <Compile Include="Dialect\MsSql7Dialect.cs" /> <Compile Include="Dialect\MySQLDialect.cs" /> <Compile Include="Dialect\PostgreSQLDialect.cs" /> + <Compile Include="Dialect\Schema\PostgreSQLMetadata.cs" /> <Compile Include="Dialect\SQLiteDialect.cs" /> <Compile Include="Dialect\SybaseSQLAnywhere10Dialect.cs" /> <Compile Include="Dialect\SybaseSQLAnywhere11Dialect.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |