Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 85 additions & 10 deletions dotnet/src/dotnetframework/GxClasses/Data/GXDataCommon.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
using System.Globalization;
using GeneXus.Metadata;
using System.Data.Common;
using System.Linq;

namespace GeneXus.Data
{
Expand Down Expand Up @@ -140,6 +141,7 @@ IDataReader GetDataReader(IGxConnectionManager connManager, IGxConnection connec
void SetCursorDef(CursorDef cursorDef);
string ConcatOp(int pos);
string AfterCreateCommand(string stmt, GxParameterCollection parmBinds);
int MaxNumberOfValuesInList { get; }
}


Expand Down Expand Up @@ -945,6 +947,9 @@ public virtual string DataSource
get {return m_datasource;}
set{m_datasource=value;}
}

public virtual int MaxNumberOfValuesInList => int.MaxValue;

public string ConnectionStringForLog()
{
string result="";
Expand Down Expand Up @@ -3705,6 +3710,76 @@ public GxDbmsUtils(IGxDataRecord db)
{
dbmsHandler = db;
}
IEnumerable<IEnumerable<T>> Split<T>(T[] arr, int size)
{
for (int i = 0; i < arr.Length / size + 1; i++)
{
yield return arr.Skip(i * size).Take(size);
}
}
IEnumerable<IList> Split(IList values, int size)
{
IList list = new List<object>(size);

foreach (object item in values)
{
list.Add(item);
if (list.Count == size)
{
yield return list;
list = new List<object>(size);
}
}
if (list.Count != 0)
{
yield return list;
}
}
string ChunkValueList<T>(T[] values, string prefix, string postfix)
{
StringBuilder stringBuilder = new StringBuilder();
if (values.Length > dbmsHandler.MaxNumberOfValuesInList)
{
foreach (T[] svalues in Split(values, dbmsHandler.MaxNumberOfValuesInList))
{
if (stringBuilder.Length > 0)
stringBuilder.Append(" OR ");
stringBuilder.Append(prefix);
stringBuilder.Append(ValueList(svalues));
stringBuilder.Append(postfix);
}
}
else
{
stringBuilder.Append(prefix);
stringBuilder.Append(ValueList(values));
stringBuilder.Append(postfix);
}
return stringBuilder.ToString();
}
string ChunkValueList(IList values, string prefix, string postfix)
{
StringBuilder stringBuilder = new StringBuilder();
if (values.Count > dbmsHandler.MaxNumberOfValuesInList)
{
foreach (IList svalues in Split(values, dbmsHandler.MaxNumberOfValuesInList))
{
if (stringBuilder.Length > 0)
stringBuilder.Append(" OR ");
stringBuilder.Append(prefix);
stringBuilder.Append(ValueList(svalues));
stringBuilder.Append(postfix);
}
}
else
{
stringBuilder.Append(prefix);
stringBuilder.Append(ValueList(values));
stringBuilder.Append(postfix);

}
return stringBuilder.ToString();
}
public string ValueList(short[] Values, string Prefix, string Postfix)
{
if (Values == null || Values.Length == 0)
Expand All @@ -3713,7 +3788,7 @@ public string ValueList(short[] Values, string Prefix, string Postfix)
}
else
{
return Prefix + ValueList(Values) + Postfix;
return ChunkValueList(Values, Prefix, Postfix);
}
}
public string ValueList(int[] Values, string Prefix, string Postfix)
Expand All @@ -3724,7 +3799,7 @@ public string ValueList(int[] Values, string Prefix, string Postfix)
}
else
{
return Prefix + ValueList(Values) + Postfix;
return ChunkValueList(Values, Prefix, Postfix);
}
}
public string ValueList(long[] Values, string Prefix, string Postfix)
Expand All @@ -3735,7 +3810,7 @@ public string ValueList(long[] Values, string Prefix, string Postfix)
}
else
{
return Prefix + ValueList(Values) + Postfix;
return ChunkValueList(Values, Prefix, Postfix);
}
}
public string ValueList(decimal[] Values, string Prefix, string Postfix)
Expand All @@ -3746,7 +3821,7 @@ public string ValueList(decimal[] Values, string Prefix, string Postfix)
}
else
{
return Prefix + ValueList(Values) + Postfix;
return ChunkValueList(Values, Prefix, Postfix);
}
}
public string ValueList(float[] Values, string Prefix, string Postfix)
Expand All @@ -3757,7 +3832,7 @@ public string ValueList(float[] Values, string Prefix, string Postfix)
}
else
{
return Prefix + ValueList(Values) + Postfix;
return ChunkValueList(Values, Prefix, Postfix);
}
}
public string ValueList(double[] Values, string Prefix, string Postfix)
Expand All @@ -3768,7 +3843,7 @@ public string ValueList(double[] Values, string Prefix, string Postfix)
}
else
{
return Prefix + ValueList(Values) + Postfix;
return ChunkValueList(Values, Prefix, Postfix);
}
}
public string ValueList(DateTime[] Values, string Prefix, string Postfix)
Expand All @@ -3779,7 +3854,7 @@ public string ValueList(DateTime[] Values, string Prefix, string Postfix)
}
else
{
return Prefix + ValueList(Values) + Postfix;
return ChunkValueList(Values, Prefix, Postfix);
}
}
public string ValueList(string[] Values, string Prefix, string Postfix)
Expand All @@ -3790,7 +3865,7 @@ public string ValueList(string[] Values, string Prefix, string Postfix)
}
else
{
return Prefix + ValueList(Values) + Postfix;
return ChunkValueList(Values, Prefix, Postfix);
}
}
public string ValueList(bool[] Values, string Prefix, string Postfix)
Expand All @@ -3801,7 +3876,7 @@ public string ValueList(bool[] Values, string Prefix, string Postfix)
}
else
{
return Prefix + ValueList(Values) + Postfix;
return ChunkValueList(Values, Prefix, Postfix);
}
}
public string ValueList(IList Values, string Prefix, string Postfix)
Expand All @@ -3812,7 +3887,7 @@ public string ValueList(IList Values, string Prefix, string Postfix)
}
else
{
return Prefix + ValueList(Values) + Postfix;
return ChunkValueList(Values, Prefix, Postfix);
}
}
public string ValueList(short[] Values)
Expand Down
2 changes: 1 addition & 1 deletion dotnet/src/dotnetframework/GxClasses/Data/GXDataOracle.cs
Original file line number Diff line number Diff line change
Expand Up @@ -961,7 +961,7 @@ public override IGeographicNative GetGeospatial(IGxDbCommand cmd, IDataRecord DR
return gtmp;
}
}

public override int MaxNumberOfValuesInList => 1000;
public override bool AllowsDuplicateParameters
{
get
Expand Down