From: <fab...@us...> - 2008-11-08 17:07:58
|
Revision: 3901 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3901&view=rev Author: fabiomaulo Date: 2008-11-08 17:07:55 +0000 (Sat, 08 Nov 2008) Log Message: ----------- Fix NH-1561 by Mark Junker (with modifications) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/Schema/AbstractDataBaseSchema.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Dialect/Schema/SybaseAnywhereMetaData.cs trunk/nhibernate/src/NHibernate/Dialect/SybaseASA10Dialect.cs trunk/nhibernate/src/NHibernate/Dialect/SybaseASA9Dialect.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/Schema/AbstractDataBaseSchema.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Schema/AbstractDataBaseSchema.cs 2008-11-08 16:15:12 UTC (rev 3900) +++ trunk/nhibernate/src/NHibernate/Dialect/Schema/AbstractDataBaseSchema.cs 2008-11-08 17:07:55 UTC (rev 3901) @@ -20,6 +20,11 @@ this.connection = connection; } + protected DbConnection Connection + { + get { return connection; } + } + #region IDataBaseSchema Members public virtual bool StoresMixedCaseQuotedIdentifiers Added: trunk/nhibernate/src/NHibernate/Dialect/Schema/SybaseAnywhereMetaData.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Schema/SybaseAnywhereMetaData.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Dialect/Schema/SybaseAnywhereMetaData.cs 2008-11-08 17:07:55 UTC (rev 3901) @@ -0,0 +1,139 @@ +using System; +using System.Data; +using System.Data.Common; + +namespace NHibernate.Dialect.Schema +{ + // Metadata for connections using the iAnywhere.Data.SQLAnywhere ADO.NET provider + public class SybaseAnywhereDataBaseMetaData : AbstractDataBaseSchema + { + public SybaseAnywhereDataBaseMetaData(DbConnection pObjConnection) : base(pObjConnection) {} + + public override ITableMetadata GetTableMetadata(DataRow rs, bool extras) + { + return new SybaseAnywhereTableMetaData(rs, this, extras); + } + + public override DataTable GetTables(string catalog, string schemaPattern, string tableNamePattern, string[] types) + { + var restrictions = new[] {schemaPattern, tableNamePattern, null}; + DataTable objTbl = Connection.GetSchema("Tables", restrictions); + return objTbl; + } + + public override DataTable GetIndexInfo(string catalog, string schemaPattern, string tableName) + { + var restrictions = new[] {schemaPattern, tableName, null}; + DataTable objTbl = Connection.GetSchema("Indexes", restrictions); + return objTbl; + } + + public override DataTable GetIndexColumns(string catalog, string schemaPattern, string tableName, string indexName) + { + var restrictions = new[] {schemaPattern, tableName, indexName, null}; + DataTable objTbl = Connection.GetSchema("IndexColumns", restrictions); + return objTbl; + } + + public override DataTable GetColumns(string catalog, string schemaPattern, string tableNamePattern, + string columnNamePattern) + { + var restrictions = new[] {schemaPattern, tableNamePattern, null}; + DataTable objTbl = Connection.GetSchema("Columns", restrictions); + return objTbl; + } + + public override DataTable GetForeignKeys(string catalog, string schema, string table) + { + var restrictions = new[] {schema, table, null}; + DataTable objTbl = Connection.GetSchema("ForeignKeys", restrictions); + return objTbl; + } + } + + public class SybaseAnywhereTableMetaData : AbstractTableMetadata + { + public SybaseAnywhereTableMetaData(DataRow rs, IDataBaseSchema meta, bool extras) : base(rs, meta, extras) {} + + protected override IColumnMetadata GetColumnMetadata(DataRow rs) + { + return new SybaseAnywhereColumnMetaData(rs); + } + + protected override string GetColumnName(DataRow rs) + { + return Convert.ToString(rs["COLUMN_NAME"]); + } + + protected override string GetConstraintName(DataRow rs) + { + // There is no thing like a constraint name for ASA9 - so + // we just use the column name here ... + return Convert.ToString(rs["COLUMN_NAME"]); + } + + protected override IForeignKeyMetadata GetForeignKeyMetadata(DataRow rs) + { + return new SybaseAnywhereForeignKeyMetaData(rs); + } + + protected override IIndexMetadata GetIndexMetadata(DataRow rs) + { + return new SybaseAnywhereIndexMetaData(rs); + } + + protected override string GetIndexName(DataRow rs) + { + return (string) rs["INDEX_NAME"]; + } + + protected override void ParseTableInfo(DataRow rs) + { + Catalog = null; + Schema = Convert.ToString(rs["TABLE_SCHEMA"]); + if (string.IsNullOrEmpty(Schema)) + { + Schema = null; + } + Name = Convert.ToString(rs["TABLE_NAME"]); + } + } + + public class SybaseAnywhereColumnMetaData : AbstractColumnMetaData + { + public SybaseAnywhereColumnMetaData(DataRow rs) : base(rs) + { + Name = Convert.ToString(rs["COLUMN_NAME"]); + object objValue = rs["COLUMN_SIZE"]; + if (objValue != DBNull.Value) + { + ColumnSize = Convert.ToInt32(objValue); + } + objValue = rs["PRECISION"]; + if (objValue != DBNull.Value) + { + NumericalPrecision = Convert.ToInt32(objValue); + } + Nullable = Convert.ToString(rs["IS_NULLABLE"]); + TypeName = Convert.ToString(rs["DATA_TYPE"]); + } + } + + public class SybaseAnywhereIndexMetaData : AbstractIndexMetadata + { + public SybaseAnywhereIndexMetaData(DataRow rs) : base(rs) + { + Name = (string) rs["INDEX_NAME"]; + } + } + + public class SybaseAnywhereForeignKeyMetaData : AbstractForeignKeyMetadata + { + public SybaseAnywhereForeignKeyMetaData(DataRow rs) : base(rs) + { + // There is no thing like a constraint name for ASA9 - so + // we just use the column name here ... + Name = (string) rs["COLUMN_NAME"]; + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Dialect/SybaseASA10Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/SybaseASA10Dialect.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Dialect/SybaseASA10Dialect.cs 2008-11-08 17:07:55 UTC (rev 3901) @@ -0,0 +1,15 @@ +using System.Data; + +namespace NHibernate.Dialect +{ + public class SybaseASA10Dialect : SybaseASA9Dialect + { + public SybaseASA10Dialect() + { + RegisterColumnType(DbType.StringFixedLength, 255, "NCHAR($l)"); + RegisterColumnType(DbType.String, 1073741823, "LONG NVARCHAR"); + RegisterColumnType(DbType.String, 255, "NVARCHAR($l)"); + RegisterColumnType(DbType.String, "LONG NVARCHAR"); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Dialect/SybaseASA9Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/SybaseASA9Dialect.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Dialect/SybaseASA9Dialect.cs 2008-11-08 17:07:55 UTC (rev 3901) @@ -0,0 +1,91 @@ +using System.Data; +using System.Data.Common; +using NHibernate.Dialect.Function; +using NHibernate.Dialect.Schema; +using NHibernate.SqlCommand; + +namespace NHibernate.Dialect +{ + public class SybaseASA9Dialect : SybaseAnywhereDialect + { + public SybaseASA9Dialect() + { + RegisterColumnType(DbType.AnsiStringFixedLength, 255, "CHAR($l)"); + RegisterColumnType(DbType.AnsiString, "VARCHAR(255)"); + RegisterColumnType(DbType.AnsiString, 255, "VARCHAR($l)"); + RegisterColumnType(DbType.AnsiString, 2147483647, "LONG VARCHAR"); // should use the IType.ClobType + RegisterColumnType(DbType.Binary, "BINARY(255)"); + RegisterColumnType(DbType.Binary, 2147483647, "LONG BINARY"); // should use the IType.BlobType + RegisterColumnType(DbType.Boolean, "BIT"); + RegisterColumnType(DbType.Byte, "SMALLINT"); + RegisterColumnType(DbType.Currency, "DECIMAL(18,4)"); + RegisterColumnType(DbType.Date, "DATE"); + RegisterColumnType(DbType.DateTime, "TIMESTAMP"); + RegisterColumnType(DbType.Decimal, "DECIMAL(18,5)"); // NUMERIC(18,5) is equivalent to DECIMAL(18,5) + RegisterColumnType(DbType.Decimal, 18, "DECIMAL(18,$l)"); + RegisterColumnType(DbType.Double, "DOUBLE"); + RegisterColumnType(DbType.Guid, "CHAR(16)"); + RegisterColumnType(DbType.Int16, "SMALLINT"); + RegisterColumnType(DbType.Int32, "INTEGER"); + RegisterColumnType(DbType.Int64, "BIGINT"); + RegisterColumnType(DbType.Single, "FLOAT"); + RegisterColumnType(DbType.StringFixedLength, 255, "CHAR($l)"); + RegisterColumnType(DbType.String, 1073741823, "LONG VARCHAR"); + RegisterColumnType(DbType.String, 255, "VARCHAR($l)"); + RegisterColumnType(DbType.String, "LONG VARCHAR"); + RegisterColumnType(DbType.Time, "TIME"); + RegisterColumnType(DbType.SByte, "SMALLINT"); + RegisterColumnType(DbType.UInt16, "UNSIGNED SMALLINT"); + RegisterColumnType(DbType.UInt32, "UNSIGNED INT"); + RegisterColumnType(DbType.UInt64, "UNSIGNED BIGINT"); + RegisterColumnType(DbType.VarNumeric, "NUMERIC($l)"); + //RegisterColumnType(DbType.Xml, "TEXT"); + + // Override standard HQL function + RegisterFunction("current_timestamp", new StandardSQLFunction("current_timestamp")); + RegisterFunction("length", new StandardSafeSQLFunction("length", NHibernateUtil.String, 1)); + RegisterFunction("substring", new AnsiSubstringFunction()); + RegisterFunction("nullif", new StandardSafeSQLFunction("nullif", 2)); + RegisterFunction("lower", new StandardSafeSQLFunction("lower", NHibernateUtil.String, 1)); + RegisterFunction("upper", new StandardSafeSQLFunction("upper", NHibernateUtil.String, 1)); + ; + RegisterFunction("now", new StandardSQLFunction("now")); + } + + public override bool SupportsLimit + { + get { return true; } + } + + public override bool SupportsVariableLimit + { + get { return false; } + } + + public override SqlString GetLimitString(SqlString querySqlString, int offset, int limit) + { + int intSelectInsertPoint = GetAfterSelectInsertPoint(querySqlString); + string strLimit = string.Format(" TOP {0} START AT {1}", limit, offset + 1); + return querySqlString.Insert(intSelectInsertPoint, strLimit); + } + + public override IDataBaseSchema GetDataBaseSchema(DbConnection connection) + { + return new SybaseAnywhereDataBaseMetaData(connection); + } + + private static int GetAfterSelectInsertPoint(SqlString sql) + { + string[] arrSelectStrings = {"select distinct", "select all", "select"}; + for (int i = 0; i != arrSelectStrings.Length; ++i) + { + string strSelect = arrSelectStrings[i]; + if (sql.StartsWithCaseInsensitive(strSelect)) + { + return strSelect.Length; + } + } + return 0; + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-08 16:15:12 UTC (rev 3900) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-08 17:07:55 UTC (rev 3901) @@ -444,6 +444,9 @@ <Compile Include="Bytecode\ProxyFactoryFactoryNotConfiguredException.cs" /> <Compile Include="Bytecode\UnableToLoadProxyFactoryFactoryException.cs" /> <Compile Include="Dialect\Schema\SQLiteMetaData.cs" /> + <Compile Include="Dialect\Schema\SybaseAnywhereMetaData.cs" /> + <Compile Include="Dialect\SybaseASA10Dialect.cs" /> + <Compile Include="Dialect\SybaseASA9Dialect.cs" /> <Compile Include="Id\SelectGenerator.cs" /> <Compile Include="Properties\BackFieldStrategy.cs" /> <Compile Include="Bytecode\CodeDom\BytecodeProviderImpl.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |