public SqlType[] PrepareParameterTypes(SqlString sqlString, ISessionFactoryImplementor factory, GetNamedParameterLocations getNamedParameterLocations, int startParameterIndex, bool addLimit, bool addOffset)
		{
			List<IType> paramTypeList = new List<IType>();
			int parameterIndex = 0;
			int totalSpan = 0;

			CreatePositionalParameterLocations(factory);

			IList<Parameter> sqlParameters = FindParametersIn(sqlString);

			for (int index = 0; index < PositionalParameterTypes.Length; index++)
			{
				IType type = PositionalParameterTypes[index];
				ArrayHelper.SafeSetValue(paramTypeList, parameterIndex, type);

				int location = PositionalParameterLocations[index];
				location = FindAdjustedParameterLocation(location);
				int span = type.GetColumnSpan(factory);
				SetParameterLocation(sqlParameters, startParameterIndex + totalSpan, location, span);

				totalSpan += span;
				parameterIndex++;
			}

			for (int index = 0; index < FilteredParameterTypes.Count; index++)
			{
				IType type = FilteredParameterTypes[index];
				ArrayHelper.SafeSetValue(paramTypeList, parameterIndex, type);

				int location = FilteredParameterLocations[index];
				int span = type.GetColumnSpan(factory);
				SetParameterLocation(sqlParameters, startParameterIndex + totalSpan, location, span);

				totalSpan += span;
				parameterIndex++;
			}

			if (NamedParameters != null && NamedParameters.Count > 0)
			{
				// convert the named parameters to an array of types
				foreach (KeyValuePair<string, TypedValue> namedParameter in NamedParameters)
				{
					TypedValue typedval = namedParameter.Value;
					ArrayHelper.SafeSetValue(paramTypeList, parameterIndex, typedval.Type);

					int span = typedval.Type.GetColumnSpan(factory);
					string name = namedParameter.Key;
					int[] locs = getNamedParameterLocations(name);
					for (int i = 0; i < locs.Length; i++)
					{
						int location = locs[i];
						location = FindAdjustedParameterLocation(location);

						// can still clash with positional parameters
						//  could consider throwing an exception to locate problem (NH-1098)
						while ((location < sqlParameters.Count) && (sqlParameters[location].ParameterPosition != null))
							location++;

						SetParameterLocation(sqlParameters, startParameterIndex + totalSpan, location, span);
					}

					totalSpan += span;
					parameterIndex++;
				}
			}

			if (_tempPagingParameterIndexes != null)
			{
				_pagingParameterIndexMap = new Dictionary<int, int>();

				var pagingParameters =
					sqlString.Parts
						.Cast<object>()
						.Where(p => p is Parameter)
						.Cast<Parameter>()
						.Where(p => p.ParameterPosition.HasValue && p.ParameterPosition < 0)
						.ToList();

				foreach (Parameter pagingParameter in pagingParameters)
				{
					int pagingValue = _tempPagingParameterIndexes[pagingParameter.ParameterPosition.Value];
					int position = parameterIndex + startParameterIndex;
					_pagingParameterIndexMap.Add(position, pagingValue);
					pagingParameter.ParameterPosition = position;
					paramTypeList.Add(NHibernateUtil.Int32);
					parameterIndex++;
					totalSpan++;
				}
			}

			if (addLimit && factory.Dialect.SupportsVariableLimit)
			{
				if (factory.Dialect.BindLimitParametersFirst)
				{
					paramTypeList.Insert(0, NHibernateUtil.Int32);
					limitParameterIndex = startParameterIndex - 1;
					if (addOffset)
					{
						paramTypeList.Insert(0, NHibernateUtil.Int32);
						offsetParameterIndex = startParameterIndex - 2;
					}
				}
				else
				{
					paramTypeList.Add(NHibernateUtil.Int32);
					limitParameterIndex = totalSpan;
					if (addOffset)
					{
						paramTypeList.Add(NHibernateUtil.Int32);
						offsetParameterIndex = totalSpan;
						limitParameterIndex = totalSpan + 1;
					}
				}

				if (addOffset && factory.Dialect.BindLimitParametersInReverseOrder)
				{
					int? temp = limitParameterIndex;
					limitParameterIndex = offsetParameterIndex;
					offsetParameterIndex = temp;
				}

				totalSpan += addOffset ? 2 : 1;
			}

			return ConvertITypesToSqlTypes(paramTypeList, factory, totalSpan);
		}
Пример #2
0
        public SqlType[] PrepareParameterTypes(SqlString sqlString, ISessionFactoryImplementor factory, GetNamedParameterLocations getNamedParameterLocations, int startParameterIndex, bool addLimit, bool addOffset)
        {
            List <IType> paramTypeList  = new List <IType>();
            int          parameterIndex = 0;
            int          totalSpan      = 0;

            IList <Parameter> sqlParameters = FindParametersIn(sqlString);

            for (int index = 0; index < PositionalParameterTypes.Length; index++)
            {
                IType type = PositionalParameterTypes[index];
                ArrayHelper.SafeSetValue(paramTypeList, parameterIndex, type);

                int location = PositionalParameterLocations[index];
                location = FindAdjustedParameterLocation(location);
                int span = type.GetColumnSpan(factory);
                SetParameterLocation(sqlParameters, startParameterIndex + parameterIndex, location, span);

                totalSpan += span;
                parameterIndex++;
            }

            for (int index = 0; index < FilteredParameterTypes.Count; index++)
            {
                IType type = FilteredParameterTypes[index];
                ArrayHelper.SafeSetValue(paramTypeList, parameterIndex, type);

                int location = FilteredParameterLocations[index];
                int span     = type.GetColumnSpan(factory);
                SetParameterLocation(sqlParameters, startParameterIndex + parameterIndex, location, span);

                totalSpan += span;
                parameterIndex++;
            }

            if (NamedParameters != null && NamedParameters.Count > 0)
            {
                // convert the named parameters to an array of types
                foreach (KeyValuePair <string, TypedValue> namedParameter in NamedParameters)
                {
                    TypedValue typedval = namedParameter.Value;
                    ArrayHelper.SafeSetValue(paramTypeList, parameterIndex, typedval.Type);

                    int    span = typedval.Type.GetColumnSpan(factory);
                    string name = namedParameter.Key;
                    int[]  locs = getNamedParameterLocations(name);
                    for (int i = 0; i < locs.Length; i++)
                    {
                        int location = locs[i];
                        location = FindAdjustedParameterLocation(location);

                        // can still clash with positional parameters
                        //  could consider throwing an exception to locate problem (NH-1098)
                        while ((location < sqlParameters.Count) && (sqlParameters[location].ParameterPosition != null))
                        {
                            location++;
                        }

                        SetParameterLocation(sqlParameters, startParameterIndex + parameterIndex, location, span);
                    }

                    totalSpan += span;
                    parameterIndex++;
                }
            }

            if (_tempPagingParameterIndexes != null)
            {
                _pagingParameterIndexMap = new Dictionary <int, int>();

                var pagingParameters =
                    sqlString.Parts
                    .Cast <object>()
                    .Where(p => p is Parameter)
                    .Cast <Parameter>()
                    .Where(p => p.ParameterPosition.HasValue && p.ParameterPosition < 0)
                    .ToList();

                foreach (Parameter pagingParameter in pagingParameters)
                {
                    int pagingValue = _tempPagingParameterIndexes[pagingParameter.ParameterPosition.Value];
                    int position    = parameterIndex + startParameterIndex;
                    _pagingParameterIndexMap.Add(position, pagingValue);
                    pagingParameter.ParameterPosition = position;
                    paramTypeList.Add(NHibernateUtil.Int32);
                    parameterIndex++;
                    totalSpan++;
                }
            }

            if (addLimit && factory.Dialect.SupportsVariableLimit)
            {
                if (factory.Dialect.BindLimitParametersFirst)
                {
                    paramTypeList.Insert(0, NHibernateUtil.Int32);
                    limitParameterIndex = startParameterIndex - 1;
                    if (addOffset)
                    {
                        paramTypeList.Insert(0, NHibernateUtil.Int32);
                        offsetParameterIndex = startParameterIndex - 2;
                    }
                }
                else
                {
                    paramTypeList.Add(NHibernateUtil.Int32);
                    limitParameterIndex = totalSpan;
                    if (addOffset)
                    {
                        paramTypeList.Add(NHibernateUtil.Int32);
                        offsetParameterIndex = totalSpan;
                        limitParameterIndex  = totalSpan + 1;
                    }
                }

                if (addOffset && factory.Dialect.BindLimitParametersInReverseOrder)
                {
                    int?temp = limitParameterIndex;
                    limitParameterIndex  = offsetParameterIndex;
                    offsetParameterIndex = temp;
                }

                totalSpan += addOffset ? 2 : 1;
            }

            return(ConvertITypesToSqlTypes(paramTypeList, factory, totalSpan));
        }
Пример #3
0
        public int BindParameters(IDbCommand command, GetNamedParameterLocations getNamedParameterLocations, int start,
                                  ISessionImplementor session)
        {
            var values  = new List <object>();
            var types   = new List <IType>();
            var sources = new List <string>();

            for (int i = 0; i < _positionalParameterLocations.Length; i++)
            {
                int    location = FindAdjustedParameterLocation(_positionalParameterLocations[i]);
                object value    = _positionalParameterValues[i];
                IType  type     = _positionalParameterTypes[i];
                ArrayHelper.SafeSetValue(values, location, value);
                ArrayHelper.SafeSetValue(types, location, type);
                ArrayHelper.SafeSetValue(sources, location, "Positional" + i);
            }

            for (int i = 0; i < filteredParameterLocations.Count; i++)
            {
                int    location = filteredParameterLocations[i];
                object value    = filteredParameterValues[i];
                IType  type     = filteredParameterTypes[i];
                ArrayHelper.SafeSetValue(values, location, value);
                ArrayHelper.SafeSetValue(types, location, type);
                ArrayHelper.SafeSetValue(sources, location, "Filter" + i);
            }

            if ((_namedParameters != null) && (_namedParameters.Count > 0))
            {
                foreach (var namedParameter in _namedParameters)
                {
                    string     name      = namedParameter.Key;
                    TypedValue typedval  = namedParameter.Value;
                    int[]      locations = getNamedParameterLocations(name);
                    for (int i = 0; i < locations.Length; i++)
                    {
                        int location = FindAdjustedParameterLocation(locations[i]);

                        // can still clash with positional parameters
                        //  could consider throwing an exception to locate problem (NH-1098)
                        while ((location < types.Count) && (types[location] != null))
                        {
                            location++;
                        }

                        ArrayHelper.SafeSetValue(values, location, typedval.Value);
                        ArrayHelper.SafeSetValue(types, location, typedval.Type);
                        ArrayHelper.SafeSetValue(sources, location, "name" + i);
                    }
                }
            }

            int span = 0;

            for (int i = 0; i < values.Count; i++)
            {
                IType  type  = types[i];
                object value = values[i];
                if (log.IsDebugEnabled)
                {
                    log.Debug(string.Format("BindParameters({0}:{1}) {2} -> [{3}]", "Named", type, value, i));
                }
                type.NullSafeSet(command, value, start + span, session);
                span += type.GetColumnSpan(session.Factory);
            }

            return(span);
        }
		public int BindParameters(IDbCommand command, GetNamedParameterLocations getNamedParameterLocations, int start,
		                          ISessionImplementor session)
		{
			var values = new List<object>();
			var types = new List<IType>();
			var sources = new List<string>();

			for (int i = 0; i < _positionalParameterLocations.Length; i++)
			{
				int location = FindAdjustedParameterLocation(_positionalParameterLocations[i]);
				object value = _positionalParameterValues[i];
				IType type = _positionalParameterTypes[i];
				ArrayHelper.SafeSetValue(values, location, value);
				ArrayHelper.SafeSetValue(types, location, type);
				ArrayHelper.SafeSetValue(sources, location, "Positional" + i);
			}

			for (int i = 0; i < filteredParameterLocations.Count; i++)
			{
				int location = filteredParameterLocations[i];
				object value = filteredParameterValues[i];
				IType type = filteredParameterTypes[i];
				ArrayHelper.SafeSetValue(values, location, value);
				ArrayHelper.SafeSetValue(types, location, type);
				ArrayHelper.SafeSetValue(sources, location, "Filter" + i);
			}

			if ((_namedParameters != null) && (_namedParameters.Count > 0))
			{
				foreach (var namedParameter in _namedParameters)
				{
					string name = namedParameter.Key;
					TypedValue typedval = namedParameter.Value;
					int[] locations = getNamedParameterLocations(name);
					for (int i = 0; i < locations.Length; i++)
					{
						int location = FindAdjustedParameterLocation(locations[i]);

						// can still clash with positional parameters
						//  could consider throwing an exception to locate problem (NH-1098)
						while ((location < types.Count) && (types[location] != null))
						{
							location++;
						}

						ArrayHelper.SafeSetValue(values, location, typedval.Value);
						ArrayHelper.SafeSetValue(types, location, typedval.Type);
						ArrayHelper.SafeSetValue(sources, location, "name" + i);
					}
				}
			}

			int span = 0;
			for (int i = 0; i < values.Count; i++)
			{
				IType type = types[i];
				object value = values[i];
				if (log.IsDebugEnabled)
				{
					log.Debug(string.Format("BindParameters({0}:{1}) {2} -> [{3}]", "Named", type, value, i));
				}
				type.NullSafeSet(command, value, start + span, session);
				span += type.GetColumnSpan(session.Factory);
			}

			return span;
		}
Пример #5
0
		public SqlType[] PrepareParameterTypes(SqlString sqlString, ISessionFactoryImplementor factory, GetNamedParameterLocations getNamedParameterLocations, int startParameterIndex, bool addLimit, bool addOffset)
		{
			List<IType> paramTypeList = new List<IType>();
			int parameterIndex = 0;
			int totalSpan = 0;

			IList<Parameter> sqlParameters = FindParametersIn(sqlString);

			for (int index = 0; index < PositionalParameterTypes.Length; index++)
			{
				IType type = PositionalParameterTypes[index];
				ArrayHelper.SafeSetValue(paramTypeList, parameterIndex, type);

				int location = PositionalParameterLocations[index];
				location = FindAdjustedParameterLocation(location);
				int span = type.GetColumnSpan(factory);
				SetParameterLocation(sqlParameters, startParameterIndex + parameterIndex, location, span);

				totalSpan += span;
				parameterIndex++;
			}

			for (int index = 0; index < FilteredParameterTypes.Count; index++)
			{
				IType type = FilteredParameterTypes[index];
				ArrayHelper.SafeSetValue(paramTypeList, parameterIndex, type);

				int location = FilteredParameterLocations[index];
				int span = type.GetColumnSpan(factory);
				SetParameterLocation(sqlParameters, startParameterIndex + parameterIndex, location, span);

				totalSpan += span;
				parameterIndex++;
			}

			if (NamedParameters != null && NamedParameters.Count > 0)
			{
				// convert the named parameters to an array of types
				foreach (KeyValuePair<string, TypedValue> namedParameter in NamedParameters)
				{
					TypedValue typedval = namedParameter.Value;
					ArrayHelper.SafeSetValue(paramTypeList, parameterIndex, typedval.Type);

					int span = typedval.Type.GetColumnSpan(factory);
					string name = namedParameter.Key;
					int[] locs = getNamedParameterLocations(name);
					for (int i = 0; i < locs.Length; i++)
					{
						int location = locs[i];
						location = FindAdjustedParameterLocation(location);

						// can still clash with positional parameters
						//  could consider throwing an exception to locate problem (NH-1098)
						while ((location < sqlParameters.Count) && (sqlParameters[location].ParameterPosition != null))
							location++;

						SetParameterLocation(sqlParameters, startParameterIndex + parameterIndex, location, span);
					}

					totalSpan += span;
					parameterIndex++;
				}
			}

			if (addLimit && factory.Dialect.SupportsVariableLimit)
			{
				if (factory.Dialect.BindLimitParametersFirst)
				{
					paramTypeList.Insert(0, NHibernateUtil.Int32);
					if (addOffset)
					{
						paramTypeList.Insert(0, NHibernateUtil.Int32);
					}
				}
				else
				{
					paramTypeList.Add(NHibernateUtil.Int32);
					if (addOffset)
					{
						paramTypeList.Add(NHibernateUtil.Int32);
					}
				}

				totalSpan += addOffset ? 2 : 1;
			}

			return ConvertITypesToSqlTypes(paramTypeList, factory, totalSpan);
		}