From: Michael D. <mik...@us...> - 2004-11-08 00:18:17
|
Update of /cvsroot/nhibernate/nhibernate/src/NHibernate/Dialect In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2397/Dialect Modified Files: DB2Dialect.cs Log Message: NH-144: DB2Dialect and DB2Driver Index: DB2Dialect.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Dialect/DB2Dialect.cs,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** DB2Dialect.cs 26 Feb 2003 20:41:57 -0000 1.4 --- DB2Dialect.cs 8 Nov 2004 00:18:00 -0000 1.5 *************** *** 1,6 **** using System; using System.Data; ! namespace NHibernate.Dialect { /// <summary> --- 1,11 ---- using System; using System.Data; + using System.Text; ! using NHibernate.SqlCommand; ! using NHibernate.SqlTypes; ! ! namespace NHibernate.Dialect ! { /// <summary> *************** *** 9,87 **** public class DB2Dialect : Dialect { ! public DB2Dialect() { ! /* Type mapping in Java was: ! ! Types.BIT, "SMALLINT" ! Types.BIGINT, "BIGINT" ! Types.SMALLINT, "SMALLINT" ! Types.TINYINT, "SMALLINT" ! Types.INTEGER, "INTEGER" ! Types.CHAR, "CHAR(1)" ! Types.VARCHAR, "VARCHAR($l)" ! Types.FLOAT, "FLOAT" ! Types.DOUBLE, "DOUBLE" ! Types.DATE, "DATE" ! Types.TIME, "TIME" ! Types.TIMESTAMP, "TIMESTAMP" ! Types.VARBINARY, "VARCHAR($l) FOR BIT DATA" ! Types.NUMERIC, "NUMERIC(19, $l)" ! Types.BLOB, "BLOB($l)" ! Types.CLOB, "CLOB($l)" ! */ ! ! Register( DbType.Bit, "SMALLINT" ); ! Register( DbType.BigInt, "BIGINT" ); ! Register( DbType.SmallInt, "SMALLINT" ); Register( DbType.Int16, "SMALLINT" ); Register( DbType.Int32, "INTEGER" ); ! Register( DbType.AnsiStringFixedLength, "VARCHAR($l)" ); ! Register( DbType.Float, "FLOAT" ); ! Register( DbType.Real, "DOUBLE" ); ! Register( DbType.DateTime, "DATE" ); ! // register( Types.TIME, "TIME" ); ??? ! Register( DbType.Timestamp, "TIMESTAMP" ); ! Register( DbType.VarBinary, "VARCHAR($l) FOR BIT DATA" ); ! Register( DbType.Decimal, "NUMERIC(19, $l)" ); ! Register( DbType.Image, "BLOB($l)" ); ! Register( DbType.Text, "CLOB($l)" ); ! ! /* ! getDefaultProperties().setProperty(Environment.OUTER_JOIN, "true"); ! getDefaultProperties().setProperty(Environment.STATEMENT_BATCH_SIZE, NO_BATCH); ! */ } ! ! public override string AddColumnString { get { return "add column"; } } ! public override bool DropConstraints { get { return false; } } ! public override bool SupportsIdentityColumns { get { return true; } } ! public override string IdentitySelectString { get { return "values IDENTITY_VAL_LOCAL()"; } } ! public override string IdentityColumnString { get { return "not null generated by default as identity"; } } ! public override string IdentityInsertString { get { return "default"; } } ! public override string GetSequenceNextValString(string sequenceName) { return "values nextval for " + sequenceName; } ! public override string GetCreateSequenceString(string sequenceName) { return "create sequence " + sequenceName; } ! public override string GetDropSequenceString(string sequenceName) { return string.Concat( "drop sequence ", sequenceName, " restrict" ); } ! public override bool SupportsSequences { get { return true; } } } } \ No newline at end of file --- 14,165 ---- public class DB2Dialect : Dialect { ! public DB2Dialect() ! { ! Register( DbType.AnsiStringFixedLength, "CHAR(254)"); ! Register( DbType.AnsiStringFixedLength, 254, "CHAR($1)" ); ! Register( DbType.AnsiString, "VARCHAR(254)" ); ! Register( DbType.AnsiString, 8000, "VARCHAR($1)" ); ! Register( DbType.AnsiString, 2147483647, "CLOB"); ! Register( DbType.Binary, 2147483647, "BLOB" ); ! Register( DbType.Boolean, "SMALLINT" ); ! Register( DbType.Byte, "SMALLINT" ); ! Register( DbType.Currency, "DECIMAL(16,4)"); ! Register( DbType.Date, "DATE"); ! Register( DbType.DateTime, "TIMESTAMP" ); ! Register( DbType.Decimal, "DECIMAL(19,5)" ); ! Register( DbType.Decimal, 19, "DECIMAL(19, $1)"); ! Register( DbType.Double, "DOUBLE" ); Register( DbType.Int16, "SMALLINT" ); Register( DbType.Int32, "INTEGER" ); ! Register( DbType.Int64, "BIGINT" ); ! Register( DbType.Single, "REAL" ); ! Register( DbType.StringFixedLength, "CHAR(254)"); ! Register( DbType.StringFixedLength, 254, "CHAR($1)"); ! Register( DbType.String, "VARCHAR(254)" ); ! Register( DbType.String, 8000, "VARCHAR($1)" ); ! Register( DbType.String, 2147483647, "CLOB" ); ! Register( DbType.Time, "TIME" ); ! ! DefaultProperties[Cfg.Environment.OuterJoin] = "true"; } ! ! public override string AddColumnString ! { get { return "add column"; } } ! ! public override bool DropConstraints ! { get { return false; } } ! ! public override bool SupportsIdentityColumns ! { get { return true; } } ! ! public override string IdentitySelectString ! { get { return "values IDENTITY_VAL_LOCAL()"; } } ! ! public override string IdentityColumnString ! { get { return "not null generated by default as identity"; } } ! ! public override string IdentityInsertString ! { get { return "default"; } } ! public override string GetSequenceNextValString(string sequenceName) ! { return "values nextval for " + sequenceName; } ! ! public override string GetCreateSequenceString(string sequenceName) ! { return "create sequence " + sequenceName; } ! ! public override string GetDropSequenceString(string sequenceName) ! { return string.Concat( "drop sequence ", sequenceName, " restrict" ); } ! public override bool SupportsSequences ! { get { return true; } } + + public override bool SupportsLimit + { + get { return true; } + } + + public override bool BindLimitParametersInReverseOrder + { + get { return false; } + } + + public override bool UseMaxForLimit + { + get { return true; } + } + + public override SqlString GetLimitString(SqlString querySqlString) + { + Parameter p1 = new Parameter(); + Parameter p2 = new Parameter(); + p1.Name = "p1"; + p1.SqlType = new Int16SqlType(); + p2.Name = "p2"; + p2.SqlType = new Int16SqlType(); + /* + * "select * from (select row_number() over(orderby_clause) as rownum, " + * querySqlString_without select + * " ) as tempresult where rownum between ? and ?" + */ + SqlStringBuilder pagingBuilder = new SqlStringBuilder(); + bool isInOrderBy = false; + StringBuilder orderByStringBuilder = new StringBuilder(); + + // build a new query and extract the order by part + foreach (object sqlPart in querySqlString.SqlParts) + { + string sqlPartString = sqlPart as string; + if (sqlPartString != null) + { + if (sqlPartString.ToLower().TrimStart().StartsWith("order by")) + { + isInOrderBy = true; + } + } + + if (isInOrderBy && sqlPart is string) + { + orderByStringBuilder.Append((string)sqlPart); + } + else + { + pagingBuilder.AddObject(sqlPart); + } + } + + string rownumClause = "rownumber() over(" + orderByStringBuilder.ToString() + ") as rownum, "; + // Add the rownum clause first, right after the original select + pagingBuilder.Insert(1, rownumClause); + // Add the rest + pagingBuilder.Insert(0, "select * from ("); + pagingBuilder.Add(") as tempresult "); + // Add the where clause + pagingBuilder.Add(" where rownum between "); + pagingBuilder.Add(p1); + pagingBuilder.Add(" and "); + pagingBuilder.Add(p2); + + return pagingBuilder.ToSqlString(); + } } } \ No newline at end of file |