|
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.
|