コード例 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="tag"></param>
        /// <param name="parameterObject"></param>
        /// <returns></returns>
        public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject)
        {
            if (parameterObject == null)
            {
                return true;
            }

            var baseTag = ((BaseTag)tag);
            object value;

            if (!string.IsNullOrEmpty(baseTag.BindName))
            {
                if (!string.IsNullOrEmpty(baseTag.Property))
                    throw new DataMapperException("Error comparing in conditional fragment. Please specify a \"bindName\" or \"property\", not both.");

                value = GetBindValue(ctx, baseTag.BindName, parameterObject);
            }
            else if (!string.IsNullOrEmpty(baseTag.Property))
            {
                // changed to enable references to current iterate items to also be catered for.
                value = GetMemberPropertyValue(ctx, baseTag, parameterObject);
            }
            else
            {
                value = parameterObject;
            }
            return (value == null);
        }
コード例 #2
0
ファイル: IsEmptyTagHandler.cs プロジェクト: reckcn/CSharp
		/// <summary>
		/// 
		/// </summary>
		/// <param name="ctx"></param>
		/// <param name="tag"></param>
		/// <param name="parameterObject"></param>
		/// <returns></returns>
		public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject)
		{
			if (parameterObject == null) 
			{
				return true;
			}
		    string propertyName = ((BaseTag)tag).Property;
		    object value = null;
		    if (!string.IsNullOrEmpty(propertyName)) 
		    {
		        value = ObjectProbe.GetMemberValue(parameterObject, propertyName, AccessorFactory);
		    } 
		    else 
		    {
		        value = parameterObject;
		    }
		    if (value is ICollection) 
		    {
		        return ((value == null) || (((ICollection) value).Count< 1));
		    }
		    if (value != null && typeof(Array).IsAssignableFrom(value.GetType())) //value.GetType().IsArray
		    {
		        return ((Array) value).GetLength(0) == 0;
		    }
		    return ((value == null) || (Convert.ToString(value).Equals("")));
		}
コード例 #3
0
        /// <summary>
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="tag"></param>
        /// <param name="parameterObject"></param>
        /// <returns></returns>
		public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject)
        {
            if (parameterObject == null) 
			{
				return false;
			}
            return ObjectProbe.HasReadableProperty(parameterObject, ((BaseTag)tag).Property);
        }
コード例 #4
0
		/// <summary>
		/// 
		/// </summary>
		/// <param name="ctx"></param>
		/// <param name="tag"></param>
		/// <param name="parameterObject"></param>
		/// <returns></returns>
		public override int DoStartFragment(SqlTagContext ctx, SqlTag tag, Object parameterObject)
		{
		    if (IsCondition(ctx, tag, parameterObject)) 
			{
				return INCLUDE_BODY;
			}
		    return SKIP_BODY;
		}
コード例 #5
0
		/// <summary>
		/// 
		/// </summary>
		/// <param name="ctx"></param>
		/// <param name="tag"></param>
		/// <param name="parameterObject"></param>
		/// <returns></returns>
		public override int DoStartFragment(SqlTagContext ctx, SqlTag tag, Object parameterObject) 
		{
			ctx.FirstNonDynamicTagWithPrepend = null ;
			if (tag.IsPrependAvailable) 
			{
				ctx.IsOverridePrepend = true;
			}
			return INCLUDE_BODY;
		}
コード例 #6
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="tag"></param>
        /// <param name="parameterObject"></param>
        /// <param name="bodyContent"></param>
        /// <returns></returns>
        /// <remarks>
        /// Updated By: Richard Beacroft
        /// Updated Date: 11\10\2013
        /// Description: Enables property iterate item paths to be replaced with full property paths, which will later be reflected.
        /// </remarks>
        public override int DoEndFragment(SqlTagContext ctx, SqlTag tag,
            object parameterObject, StringBuilder bodyContent)
        {
            IterateContext iterate = (IterateContext)ctx.GetAttribute(tag);

            if (iterate.IsCompleted)
                return INCLUDE_BODY;

            var iterateTag = ((Iterate)tag);
            var propertyName = iterateTag.Property;

            if (propertyName == null)
                propertyName = String.Empty;

            // build full reflection path
            if (!ReflectionMapper.ReplacePropertyIndexerWithFullName(ctx, iterateTag, bodyContent))
            {
                string find = propertyName + ReflectionMapper.ENUMERATOR_PLACEHOLDER;
                string replace = propertyName + "[" + iterate.Index + "]"; //Parameter-index-Dynamic

                StringHandler.Replace(bodyContent, find, replace);
            }

            if (iterate.IsFirst)
            {
                if (iterateTag.Open != null)
                {
                    bodyContent.Insert(0, ctx.ReplaceBindingVariables(iterateTag.Open));
                    bodyContent.Insert(0, ' ');
                }
            }

            if (iterate.IsLast)
            {
                if (iterateTag.Close != null)
                {
                    bodyContent.Append(ctx.ReplaceBindingVariables(iterateTag.Close));
                }
            }
            else
            {
                if (iterateTag.Conjunction != null)
                {
                    bodyContent.Append(ctx.ReplaceBindingVariables(iterateTag.Conjunction));
                    bodyContent.Append(' ');
                }
            }

            if (iterate.HasNext)
                return REPEAT_BODY;

            iterate.IsCompleted = true;

            return INCLUDE_BODY;
        }
コード例 #7
0
        /// <summary>
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="tag"></param>
        /// <param name="parameterObject"></param>
        /// <returns></returns>
        /// <remarks>
        /// Updated By: Richard Beacroft
        /// Updated Date: 11\10\2013
        /// Description: Builds full property name and checks to see if the property is readable.
        /// Not sure why it doesn't also cater for class Fields?
        /// </remarks>
        public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject)
        {
            if (parameterObject == null)
            {
                return false;
            }

            var baseTag = (BaseTag)tag;
            // build property full name from property name - specifically handles references to current iterate item, i.e. "[]."
            var propertyFullName = ctx.ReplaceIterateCurrentProperty(baseTag);

            return ObjectProbe.HasReadableProperty(parameterObject, propertyFullName);
        }
コード例 #8
0
ファイル: IsNullTagHandler.cs プロジェクト: reckcn/CSharp
		/// <summary>
		/// 
		/// </summary>
		/// <param name="ctx"></param>
		/// <param name="tag"></param>
		/// <param name="parameterObject"></param>
		/// <returns></returns>
		public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject)
		{
			if (parameterObject == null) 
			{
				return true;
			}
		    string propertyName = ((BaseTag)tag).Property;
		    object value;
		    if (!string.IsNullOrEmpty(propertyName) ) 
		    {
		        value = ObjectProbe.GetMemberValue(parameterObject, propertyName, AccessorFactory);
		    } 
		    else 
		    {
		        value = parameterObject;
		    }
		    return (value == null);
		}
コード例 #9
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="tag"></param>
        /// <param name="parameterObject"></param>
        /// <returns></returns>
        public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject)
        {
            if (parameterObject == null)
            {
                return true;
            }

            var baseTag = ((BaseTag)tag);
            string bindName = baseTag.BindName;
            string propertyName = baseTag.Property;
            object value = null;

            if (!string.IsNullOrEmpty(bindName))
            {
                if (!string.IsNullOrEmpty(propertyName))
                    throw new DataMapperException("Error comparing in conditional fragment. Please specify a \"bindName\" or \"property\", not both.");

                value = GetBindValue(ctx, bindName, parameterObject);
            }
            else if (!string.IsNullOrEmpty(propertyName))
            {
                value = GetMemberPropertyValue(ctx, baseTag, parameterObject);

                //value = ObjectProbe.GetMemberValue(parameterObject, propertyName, AccessorFactory);
            }
            else
            {
                value = parameterObject;
            }
            if (value is ICollection)
            {
                return ((value == null) || (((ICollection)value).Count < 1));
            }
            if (value != null && typeof(Array).IsAssignableFrom(value.GetType())) //value.GetType().IsArray
            {
                return ((Array)value).GetLength(0) == 0;
            }

            return ((value == null) || (Convert.ToString(value).Equals("")));
        }
コード例 #10
0
ファイル: IterateTagHandler.cs プロジェクト: reckcn/CSharp
		/// <summary>
		/// 
		/// </summary>
		/// <param name="ctx"></param>
		/// <param name="tag"></param>
		/// <param name="parameterObject"></param>
		/// <returns></returns>
		public override int DoStartFragment(SqlTagContext ctx, SqlTag tag, object parameterObject) 
		{
			IterateContext iterate = (IterateContext) ctx.GetAttribute(tag);
			if (iterate == null) 
			{
				string propertyName = ((BaseTag)tag).Property;
				object collection;
				if (!string.IsNullOrEmpty(propertyName)) 
				{
					collection = ObjectProbe.GetMemberValue(parameterObject, propertyName, AccessorFactory);
				} 
				else 
				{
					collection = parameterObject;
				}
				iterate = new IterateContext(collection);
				ctx.AddAttribute(tag, iterate);
			}
			if (iterate.HasNext) 
			{
				return INCLUDE_BODY;
			}
		    return SKIP_BODY;
		}
コード例 #11
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="ctx"></param>
 /// <param name="tag"></param>
 /// <param name="parameterObject"></param>
 /// <returns></returns>
 public abstract bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject);
コード例 #12
0
ファイル: IterateTagHandler.cs プロジェクト: reckcn/CSharp
		/// <summary>
		/// 
		/// </summary>
		/// <param name="ctx"></param>
		/// <param name="tag"></param>
		/// <param name="parameterObject"></param>
		/// <param name="bodyContent"></param>
		/// <returns></returns>
		public override int DoEndFragment(SqlTagContext ctx, SqlTag tag, 
			object parameterObject, StringBuilder bodyContent) 
		{
			IterateContext iterate = (IterateContext) ctx.GetAttribute(tag);

			if (iterate.MoveNext()) 
			{
				string propertyName = ((BaseTag)tag).Property;
				if (propertyName == null) 
				{
					propertyName = "";
				}

				string find = propertyName + "[]";
				string replace = propertyName + "[" + iterate.Index + "]";//Parameter-index-Dynamic
				Replace(bodyContent, find, replace);

				if (iterate.IsFirst) 
				{
					string open = ((Iterate)tag).Open;
					if (open != null) 
					{
						bodyContent.Insert(0,open);
						bodyContent.Insert(0,' ');
					}
				}
				if (!iterate.IsLast) 
				{
					string conjunction = ((Iterate)tag).Conjunction;
					if (conjunction != null) 
					{
						bodyContent.Append(conjunction);
						bodyContent.Append(' ');
					}
				}
				if (iterate.IsLast) 
				{
					string close = ((Iterate)tag).Close;
					if (close != null) 
					{
						bodyContent.Append(close);
					}
				}

				return REPEAT_BODY;
			}
		    return INCLUDE_BODY;
		}
コード例 #13
0
		/// <summary>
		/// 
		/// </summary>
		/// <param name="ctx"></param>
		/// <param name="tag"></param>
		/// <param name="parameterObject"></param>
		/// <returns></returns>
		public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject)
		{
			return !base.IsCondition(ctx, tag, parameterObject);
		}
コード例 #14
0
ファイル: SqlTagContext.cs プロジェクト: techvenky/mybatisnet
 public void CheckAssignFirstDynamicTagWithPrepend(SqlTag tag)
 {
     if (IsOverridePrepend
         && FirstNonDynamicTagWithPrepend == null
         && tag.IsPrependAvailable
         && !(tag.Handler is DynamicTagHandler))
     {
         FirstNonDynamicTagWithPrepend = tag;
     }
 }
コード例 #15
0
		/// <summary>
		/// 
		/// </summary>
		/// <param name="ctx"></param>
		/// <param name="tag"></param>
		/// <param name="parameterObject"></param>
		/// <returns></returns>
		public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject)
		{
			return (Compare(ctx, tag, parameterObject) == 0);
		}
コード例 #16
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="ctx"></param>
 /// <param name="tag"></param>
 /// <param name="parameterObject"></param>
 /// <returns></returns>
 public override int DoStartFragment(SqlTagContext ctx, SqlTag tag, Object parameterObject)
 {
     return INCLUDE_BODY;
 }
コード例 #17
0
ファイル: IterateTagHandler.cs プロジェクト: reckcn/CSharp
		/// <summary>
		/// 
		/// </summary>
		/// <param name="ctx"></param>
		/// <param name="tag"></param>
		/// <param name="parameterObject"></param>
		/// <param name="bodyContent"></param>
		public override void DoPrepend(SqlTagContext ctx, SqlTag tag, object parameterObject, StringBuilder bodyContent) 
		{
			IterateContext iterate = (IterateContext) ctx.GetAttribute(tag);
			if (iterate.IsFirst) 
			{
				base.DoPrepend(ctx, tag, parameterObject, bodyContent);
			}
		}
コード例 #18
0
		/// <summary>
		/// 
		/// </summary>
		/// <param name="ctx"></param>
		/// <param name="tag"></param>
		/// <param name="parameterObject"></param>
		/// <returns></returns>
		public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject)
		{
			return (parameterObject != null);
		}
コード例 #19
0
ファイル: BaseTagHandler.cs プロジェクト: reckcn/CSharp
		/// <summary>
		/// 
		/// </summary>
		/// <param name="ctx"></param>
		/// <param name="tag"></param>
		/// <param name="parameterObject"></param>
		/// <returns></returns>
		public virtual int DoStartFragment(SqlTagContext ctx, SqlTag tag, object parameterObject) 
		{
			return INCLUDE_BODY;
		}
コード例 #20
0
		/// <summary>
		/// 
		/// </summary>
		/// <param name="ctx"></param>
		/// <param name="tag"></param>
		/// <param name="parameterObject"></param>
		/// <returns></returns>
		public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject)
		{
			long x = Compare(ctx, tag, parameterObject);
			return ((x >= 0) && (x != NOT_COMPARABLE));
		}
コード例 #21
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="tag"></param>
        /// <param name="parameterObject"></param>
        /// <param name="bodyContent"></param>
        /// <remarks>
        /// Updated By: Richard Beacroft
        /// Updated Date: 11\10\2013
        /// Description: Changed the index to check for.
        /// The "iterate" tag handler has been re-worked to ensure we read the next iterate context item
        /// before the child tag elements are processed. We need to do this to ensure that we can parse 
        /// property expressions within tag elements nested within the iterate element.
        /// </remarks>
        public override void DoPrepend(SqlTagContext ctx, SqlTag tag, object parameterObject, StringBuilder bodyContent)
        {
            var iterate = (IterateContext)ctx.GetAttribute(tag);

            // because we move to the first item before we iterate, we need to check to see if this is the first item, by checking the Index = 1 and not 0.
            if (iterate.IsFirst)
            {
                base.DoPrepend(ctx, tag, parameterObject, bodyContent);
            }
        }
コード例 #22
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="tag"></param>
        /// <param name="parameterObject"></param>
        /// <returns></returns>
        /// Updated By: Richard Beacroft
        /// Updated Date: 11\10\2013
        /// Description: Enables one to be able to have sql text within an iterate element that references the current item as "[]."
        /// This is then parsed, along with any reflection path suffix to get the object instance the used is interested in.
        /// and add it to an attributes collection for later use.
        public override int DoStartFragment(SqlTagContext ctx, SqlTag tag, object parameterObject)
        {
            var iterate = (IterateContext)ctx.GetAttribute(tag);

            if (iterate == null)
            {
                var baseTag = (BaseTag)tag;

                object collection;

                if (!string.IsNullOrEmpty(baseTag.Property))
                {
                    // this will either leave the property name as it is, or if it starts with "[].", the 
                    // current iterate context item value will be used, with the rest of the property name
                    // walked to determine the field/property to get the value from.
                    collection = _tagPropertyProbe.GetMemberPropertyValue(ctx, baseTag, parameterObject);
                }
                else
                {
                    collection = parameterObject;
                }

                iterate = new IterateContext(collection);

                ctx.AddAttribute(tag, iterate);

                // if there is another item in the iterate array, then we need to include the body.
                if (iterate.MoveNext())
                    return INCLUDE_BODY;

                iterate.IsCompleted = true;

                return SKIP_BODY;
            }

            if (iterate.IsCompleted)
            {
                // reset the context to cater for nested iterations.
                ctx.RemoveAttibute(tag);
                // now re-process the tag which will re-add the now modified tag element back to the attributes collection.
                return DoStartFragment(ctx, tag, parameterObject);
            }
            else if (iterate.HasNext || iterate.IsLast)
            {
                if (iterate.MoveNext())
                    return INCLUDE_BODY;
            }

            return SKIP_BODY;
        }
コード例 #23
0
ファイル: BaseTagHandler.cs プロジェクト: reckcn/CSharp
		/// <summary>
        /// 判断是否要向StringBuilder中添加prenpend属性值
		/// </summary>
		/// <param name="ctx"></param>
		/// <param name="tag"></param>
		/// <param name="parameterObject"></param>
		/// <param name="bodyContent"></param>
		public virtual void DoPrepend(SqlTagContext ctx, SqlTag tag, object parameterObject, StringBuilder bodyContent) 
		{
			if (tag.IsPrependAvailable) 
			{
				if (bodyContent.ToString().Trim().Length > 0) 
				{
					if (ctx.IsOverridePrepend && tag == ctx.FirstNonDynamicTagWithPrepend) 
					{
						ctx.IsOverridePrepend = false;
					} 
					else 
					{
						bodyContent.Insert(0, tag.Prepend);
					}
				} 
				else 
				{
					if (ctx.FirstNonDynamicTagWithPrepend != null) 
					{
						ctx.FirstNonDynamicTagWithPrepend = null;
						ctx.IsOverridePrepend =true;
					}
				}
			}
		}
コード例 #24
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="sqlTag"></param>
        /// <param name="parameterObject"></param>
        /// <returns></returns>
        protected long Compare(SqlTagContext ctx, SqlTag sqlTag, object parameterObject)
        {
            Conditional tag = (Conditional)sqlTag;
            string bindName = tag.BindName;
            string propertyName = tag.Property;
            string comparePropertyName = tag.CompareProperty;
            string compareValue = tag.CompareValue;
            object value1 = null;
            Type type = null;

            if (!string.IsNullOrEmpty(bindName))
            {
                if (!string.IsNullOrEmpty(propertyName))
                    throw new DataMapperException("Error comparing in conditional fragment. Please specify a \"bindName\" or \"property\", not both.");
                value1 = GetBindValue(ctx, bindName, parameterObject);
                type = value1.GetType();
            }
            else if (!string.IsNullOrEmpty(propertyName))
            {
                value1 = GetMemberPropertyValue(ctx, tag, parameterObject);
                type = value1.GetType();
            }
            else
            {
                value1 = parameterObject;
                if (value1 != null)
                {
                    type = parameterObject.GetType();
                }
                else
                {
                    type = typeof(object);
                }
            }
            if (!string.IsNullOrEmpty(comparePropertyName))
            {
                object value2 = GetMemberComparePropertyValue(ctx, tag, parameterObject);
                return CompareValues(type, value1, value2);
            }
            if (!string.IsNullOrEmpty(compareValue))
            {
                return CompareValues(type, value1, compareValue);
            }
            throw new DataMapperException("Error comparing in conditional fragment.  Unknown 'compare to' values.");
        }
コード例 #25
0
ファイル: BaseTagHandler.cs プロジェクト: reckcn/CSharp
		/// <summary>
		/// 
		/// </summary>
		/// <param name="ctx"></param>
		/// <param name="tag"></param>
		/// <param name="parameterObject"></param>
		/// <param name="bodyContent"></param>
		/// <returns></returns>
		public virtual int DoEndFragment(SqlTagContext ctx, SqlTag tag, object parameterObject, StringBuilder bodyContent) 
		{
			return INCLUDE_BODY;
		}
コード例 #26
0
		/// <summary>
		/// 
		/// </summary>
		/// <param name="ctx"></param>
		/// <param name="sqlTag"></param>
		/// <param name="parameterObject"></param>
		/// <returns></returns>
		protected long Compare(SqlTagContext ctx, SqlTag sqlTag, object parameterObject)
		{
			Conditional tag = (Conditional)sqlTag;
			string propertyName = tag.Property;
			string comparePropertyName = tag.CompareProperty;
			string compareValue = tag.CompareValue;

			object value1 = null;
			Type type = null;
			if (!string.IsNullOrEmpty(propertyName)) 
			{
				value1 = ObjectProbe.GetMemberValue(parameterObject, propertyName, AccessorFactory);
				type = value1.GetType();
			} 
			else 
			{
				value1 = parameterObject;
				if (value1 != null) 
				{
					type = parameterObject.GetType();
				} 
				else 
				{
					type = typeof(object);
				}
			}
			if (!string.IsNullOrEmpty(comparePropertyName)) 
			{
                object value2 = ObjectProbe.GetMemberValue(parameterObject, comparePropertyName, AccessorFactory);
				return CompareValues(type, value1, value2);
			}
		    if (!string.IsNullOrEmpty(compareValue)) 
		    {
		        return CompareValues(type, value1, compareValue);
		    }
		    throw new DataMapperException("Error comparing in conditional fragment.  Uknown 'compare to' values.");
		}