2525using System . Globalization ;
2626using GeneXus . Metadata ;
2727using System . Data . Common ;
28+ using System . Linq ;
2829
2930namespace GeneXus . Data
3031{
@@ -140,6 +141,7 @@ IDataReader GetDataReader(IGxConnectionManager connManager, IGxConnection connec
140141 void SetCursorDef ( CursorDef cursorDef ) ;
141142 string ConcatOp ( int pos ) ;
142143 string AfterCreateCommand ( string stmt , GxParameterCollection parmBinds ) ;
144+ int MaxNumberOfValuesInList { get ; }
143145 }
144146
145147
@@ -945,6 +947,9 @@ public virtual string DataSource
945947 get { return m_datasource ; }
946948 set { m_datasource = value ; }
947949 }
950+
951+ public virtual int MaxNumberOfValuesInList => int . MaxValue ;
952+
948953 public string ConnectionStringForLog ( )
949954 {
950955 string result = "" ;
@@ -3705,6 +3710,76 @@ public GxDbmsUtils(IGxDataRecord db)
37053710 {
37063711 dbmsHandler = db ;
37073712 }
3713+ IEnumerable < IEnumerable < T > > Split < T > ( T [ ] arr , int size )
3714+ {
3715+ for ( int i = 0 ; i < arr . Length / size + 1 ; i ++ )
3716+ {
3717+ yield return arr . Skip ( i * size ) . Take ( size ) ;
3718+ }
3719+ }
3720+ IEnumerable < IList > Split ( IList values , int size )
3721+ {
3722+ IList list = new List < object > ( size ) ;
3723+
3724+ foreach ( object item in values )
3725+ {
3726+ list . Add ( item ) ;
3727+ if ( list . Count == size )
3728+ {
3729+ yield return list ;
3730+ list = new List < object > ( size ) ;
3731+ }
3732+ }
3733+ if ( list . Count != 0 )
3734+ {
3735+ yield return list ;
3736+ }
3737+ }
3738+ string ChunkValueList < T > ( T [ ] values , string prefix , string postfix )
3739+ {
3740+ StringBuilder stringBuilder = new StringBuilder ( ) ;
3741+ if ( values . Length > dbmsHandler . MaxNumberOfValuesInList )
3742+ {
3743+ foreach ( T [ ] svalues in Split ( values , dbmsHandler . MaxNumberOfValuesInList ) )
3744+ {
3745+ if ( stringBuilder . Length > 0 )
3746+ stringBuilder . Append ( " OR " ) ;
3747+ stringBuilder . Append ( prefix ) ;
3748+ stringBuilder . Append ( ValueList ( svalues ) ) ;
3749+ stringBuilder . Append ( postfix ) ;
3750+ }
3751+ }
3752+ else
3753+ {
3754+ stringBuilder . Append ( prefix ) ;
3755+ stringBuilder . Append ( ValueList ( values ) ) ;
3756+ stringBuilder . Append ( postfix ) ;
3757+ }
3758+ return stringBuilder . ToString ( ) ;
3759+ }
3760+ string ChunkValueList ( IList values , string prefix , string postfix )
3761+ {
3762+ StringBuilder stringBuilder = new StringBuilder ( ) ;
3763+ if ( values . Count > dbmsHandler . MaxNumberOfValuesInList )
3764+ {
3765+ foreach ( IList svalues in Split ( values , dbmsHandler . MaxNumberOfValuesInList ) )
3766+ {
3767+ if ( stringBuilder . Length > 0 )
3768+ stringBuilder . Append ( " OR " ) ;
3769+ stringBuilder . Append ( prefix ) ;
3770+ stringBuilder . Append ( ValueList ( svalues ) ) ;
3771+ stringBuilder . Append ( postfix ) ;
3772+ }
3773+ }
3774+ else
3775+ {
3776+ stringBuilder . Append ( prefix ) ;
3777+ stringBuilder . Append ( ValueList ( values ) ) ;
3778+ stringBuilder . Append ( postfix ) ;
3779+
3780+ }
3781+ return stringBuilder . ToString ( ) ;
3782+ }
37083783 public string ValueList ( short [ ] Values , string Prefix , string Postfix )
37093784 {
37103785 if ( Values == null || Values . Length == 0 )
@@ -3713,7 +3788,7 @@ public string ValueList(short[] Values, string Prefix, string Postfix)
37133788 }
37143789 else
37153790 {
3716- return Prefix + ValueList ( Values ) + Postfix ;
3791+ return ChunkValueList ( Values , Prefix , Postfix ) ;
37173792 }
37183793 }
37193794 public string ValueList ( int [ ] Values , string Prefix , string Postfix )
@@ -3724,7 +3799,7 @@ public string ValueList(int[] Values, string Prefix, string Postfix)
37243799 }
37253800 else
37263801 {
3727- return Prefix + ValueList ( Values ) + Postfix ;
3802+ return ChunkValueList ( Values , Prefix , Postfix ) ;
37283803 }
37293804 }
37303805 public string ValueList ( long [ ] Values , string Prefix , string Postfix )
@@ -3735,7 +3810,7 @@ public string ValueList(long[] Values, string Prefix, string Postfix)
37353810 }
37363811 else
37373812 {
3738- return Prefix + ValueList ( Values ) + Postfix ;
3813+ return ChunkValueList ( Values , Prefix , Postfix ) ;
37393814 }
37403815 }
37413816 public string ValueList ( decimal [ ] Values , string Prefix , string Postfix )
@@ -3746,7 +3821,7 @@ public string ValueList(decimal[] Values, string Prefix, string Postfix)
37463821 }
37473822 else
37483823 {
3749- return Prefix + ValueList ( Values ) + Postfix ;
3824+ return ChunkValueList ( Values , Prefix , Postfix ) ;
37503825 }
37513826 }
37523827 public string ValueList ( float [ ] Values , string Prefix , string Postfix )
@@ -3757,7 +3832,7 @@ public string ValueList(float[] Values, string Prefix, string Postfix)
37573832 }
37583833 else
37593834 {
3760- return Prefix + ValueList ( Values ) + Postfix ;
3835+ return ChunkValueList ( Values , Prefix , Postfix ) ;
37613836 }
37623837 }
37633838 public string ValueList ( double [ ] Values , string Prefix , string Postfix )
@@ -3768,7 +3843,7 @@ public string ValueList(double[] Values, string Prefix, string Postfix)
37683843 }
37693844 else
37703845 {
3771- return Prefix + ValueList ( Values ) + Postfix ;
3846+ return ChunkValueList ( Values , Prefix , Postfix ) ;
37723847 }
37733848 }
37743849 public string ValueList ( DateTime [ ] Values , string Prefix , string Postfix )
@@ -3779,7 +3854,7 @@ public string ValueList(DateTime[] Values, string Prefix, string Postfix)
37793854 }
37803855 else
37813856 {
3782- return Prefix + ValueList ( Values ) + Postfix ;
3857+ return ChunkValueList ( Values , Prefix , Postfix ) ;
37833858 }
37843859 }
37853860 public string ValueList ( string [ ] Values , string Prefix , string Postfix )
@@ -3790,7 +3865,7 @@ public string ValueList(string[] Values, string Prefix, string Postfix)
37903865 }
37913866 else
37923867 {
3793- return Prefix + ValueList ( Values ) + Postfix ;
3868+ return ChunkValueList ( Values , Prefix , Postfix ) ;
37943869 }
37953870 }
37963871 public string ValueList ( bool [ ] Values , string Prefix , string Postfix )
@@ -3801,7 +3876,7 @@ public string ValueList(bool[] Values, string Prefix, string Postfix)
38013876 }
38023877 else
38033878 {
3804- return Prefix + ValueList ( Values ) + Postfix ;
3879+ return ChunkValueList ( Values , Prefix , Postfix ) ;
38053880 }
38063881 }
38073882 public string ValueList ( IList Values , string Prefix , string Postfix )
@@ -3812,7 +3887,7 @@ public string ValueList(IList Values, string Prefix, string Postfix)
38123887 }
38133888 else
38143889 {
3815- return Prefix + ValueList ( Values ) + Postfix ;
3890+ return ChunkValueList ( Values , Prefix , Postfix ) ;
38163891 }
38173892 }
38183893 public string ValueList ( short [ ] Values )
0 commit comments