diff Source/Data/Sql/SqlProvider/SybaseSqlProvider.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/SybaseSqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,252 @@
+using System;
+using System.Data;
+using System.Text;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	using DataProvider;
+
+	public class SybaseSqlProvider : BasicSqlProvider
+	{
+		public SybaseSqlProvider()
+		{
+		}
+
+		protected override void BuildGetIdentity(StringBuilder sb)
+		{
+			sb
+				.AppendLine()
+				.AppendLine("SELECT @@IDENTITY");
+		}
+
+		protected override string FirstFormat              { get { return "TOP {0}"; } }
+
+		public    override bool   IsSkipSupported          { get { return false;     } }
+		public    override bool   TakeAcceptsParameter     { get { return false;     } }
+		public    override bool   IsSubQueryTakeSupported  { get { return false;     } }
+		public    override bool   IsCountSubQuerySupported { get { return false;     } }
+		public    override bool   CanCombineParameters     { get { return false;     } }
+
+		public override ISqlExpression ConvertExpression(ISqlExpression expr)
+		{
+			expr = base.ConvertExpression(expr);
+
+			if (expr is SqlFunction)
+			{
+				var func = (SqlFunction) expr;
+
+				switch (func.Name)
+				{
+					case "CharIndex" :
+						if (func.Parameters.Length == 3)
+							return Add<int>(
+								ConvertExpression(new SqlFunction(func.SystemType, "CharIndex",
+									func.Parameters[0],
+									ConvertExpression(new SqlFunction(typeof(string), "Substring",
+										func.Parameters[1],
+										func.Parameters[2], new SqlFunction(typeof(int), "Len", func.Parameters[1]))))),
+								Sub(func.Parameters[2], 1));
+						break;
+
+					case "Stuff"     :
+						if (func.Parameters[3] is SqlValue)
+						{
+							var value = (SqlValue)func.Parameters[3];
+
+							if (value.Value is string && string.IsNullOrEmpty((string)value.Value))
+								return new SqlFunction(
+									func.SystemType,
+									func.Name,
+									func.Precedence,
+									func.Parameters[0],
+									func.Parameters[1],
+									func.Parameters[1],
+									new SqlValue(null));
+						}
+
+						break;
+				}
+			}
+
+			return expr;
+		}
+
+		protected override void BuildFunction(StringBuilder sb, SqlFunction func)
+		{
+			func = ConvertFunctionParameters(func);
+			base.BuildFunction(sb, func);
+		}
+
+		private  bool _isSelect;
+		readonly bool _skipAliases;
+
+		SybaseSqlProvider(bool skipAliases)
+		{
+			_skipAliases = skipAliases;
+		}
+
+		protected override void BuildSelectClause(StringBuilder sb)
+		{
+			_isSelect = true;
+			base.BuildSelectClause(sb);
+			_isSelect = false;
+		}
+
+		protected override void BuildColumnExpression(StringBuilder sb, ISqlExpression expr, string alias, ref bool addAlias)
+		{
+			var wrap = false;
+
+			if (expr.SystemType == typeof(bool))
+			{
+				if (expr is SqlQuery.SearchCondition)
+					wrap = true;
+				else
+				{
+					var ex = expr as SqlExpression;
+					wrap = ex != null && ex.Expr == "{0}" && ex.Parameters.Length == 1 && ex.Parameters[0] is SqlQuery.SearchCondition;
+				}
+			}
+
+			if (wrap) sb.Append("CASE WHEN ");
+			base.BuildColumnExpression(sb, expr, alias, ref addAlias);
+			if (wrap) sb.Append(" THEN 1 ELSE 0 END");
+
+			if (_skipAliases) addAlias = false;
+		}
+
+		protected override ISqlProvider CreateSqlProvider()
+		{
+			return new SybaseSqlProvider(_isSelect);
+		}
+
+		protected override void BuildDataType(StringBuilder sb, SqlDataType type)
+		{
+			switch (type.SqlDbType)
+			{
+#if !MONO
+				case SqlDbType.DateTime2 : sb.Append("DateTime");        break;
+#endif
+				default                  : base.BuildDataType(sb, type); break;
+			}
+		}
+
+		protected override void BuildDeleteClause(StringBuilder sb)
+		{
+			AppendIndent(sb);
+			sb.Append("DELETE FROM ");
+//			BuildTableName(sb, SqlQuery.From.Tables[0], true, false);
+
+			ISqlTableSource table;
+			ISqlTableSource source;
+
+			if (SqlQuery.Delete.Table != null)
+				table = source = SqlQuery.Delete.Table;
+			else
+			{
+				table  = SqlQuery.From.Tables[0];
+				source = SqlQuery.From.Tables[0].Source;
+			}
+
+			var alias = GetTableAlias(table);
+			BuildPhysicalTable(sb, source, alias);
+
+			sb.AppendLine();
+		}
+
+		protected override void BuildUpdateTableName(StringBuilder sb)
+		{
+			if (SqlQuery.Update.Table != null && SqlQuery.Update.Table != SqlQuery.From.Tables[0].Source)
+				BuildPhysicalTable(sb, SqlQuery.Update.Table, null);
+			else
+				BuildTableName(sb, SqlQuery.From.Tables[0], true, false);
+		}
+
+		protected override void BuildString(StringBuilder sb, string value)
+		{
+			foreach (var ch in value)
+			{
+				if (ch > 127)
+				{
+					sb.Append("N");
+					break;
+				}
+			}
+
+			base.BuildString(sb, value);
+		}
+
+		protected override void BuildChar(StringBuilder sb, char value)
+		{
+			if (value > 127)
+				sb.Append("N");
+
+			base.BuildChar(sb, value);
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.NameToQueryParameter:
+				case ConvertType.NameToCommandParameter:
+				case ConvertType.NameToSprocParameter:
+					{
+						var name = "@" + value;
+
+						if (name.Length > 27)
+							name = name.Substring(0, 27);
+
+						return name;
+					}
+
+				case ConvertType.NameToQueryField:
+				case ConvertType.NameToQueryFieldAlias:
+				case ConvertType.NameToQueryTableAlias:
+					{
+						var name = value.ToString();
+
+						if (name.Length > 28 || name.Length > 0 && name[0] == '[')
+							return value;
+					}
+
+					return "[" + value + "]";
+
+				case ConvertType.NameToDatabase:
+				case ConvertType.NameToOwner:
+				case ConvertType.NameToQueryTable:
+					{
+						var name = value.ToString();
+
+						if (name.Length > 28 || name.Length > 0 && (name[0] == '[' || name[0] == '#'))
+							return value;
+
+						if (name.IndexOf('.') > 0)
+							value = string.Join("].[", name.Split('.'));
+					}
+
+					return "[" + value + "]";
+
+				case ConvertType.SprocParameterToName:
+					if (value != null)
+					{
+						var str = value.ToString();
+						return str.Length > 0 && str[0] == '@'? str.Substring(1): str;
+					}
+
+					break;
+			}
+
+			return value;
+		}
+
+		protected override void BuildInsertOrUpdateQuery(StringBuilder sb)
+		{
+			BuildInsertOrUpdateQueryAsUpdateInsert(sb);
+		}
+
+		protected override void BuildEmptyInsert(StringBuilder sb)
+		{
+			sb.AppendLine("VALUES ()");
+		}
+	}
+}