Skip to content

Commit e3c5b90

Browse files
committed
Fix dates evaluated at the server
1 parent 6f8b5e1 commit e3c5b90

File tree

3 files changed

+68
-22
lines changed

3 files changed

+68
-22
lines changed

dotnet/src/dotnetcore/DynService/Cosmos/CosmosDBConnection.cs

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,6 @@ public override int ExecuteNonQuery(ServiceCursorDef cursorDef, IDataParameterCo
359359
}
360360
public override IDataReader ExecuteReader(ServiceCursorDef cursorDef, IDataParameterCollection parms, CommandBehavior behavior)
361361
{
362-
363362
Initialize();
364363
CosmosDBQuery query = cursorDef.Query as CosmosDBQuery;
365364
Container container = GetContainer(query?.TableName);
@@ -484,19 +483,26 @@ private void CreateCosmosQuery(CosmosDBQuery query,ServiceCursorDef cursorDef, I
484483
if (GeneXus.Data.Cosmos.CosmosDBHelper.FormattedAsStringGXType(item.Type))
485484
varValuestr = '"' + $"{item.Value.ToString()}" + '"';
486485
else
487-
{
488-
if (item.Value is double)
486+
{
487+
if (GeneXus.Data.Cosmos.CosmosDBHelper.FormattedAsStringDateGXType(item.Type))
489488
{
490-
NumberFormatInfo nfi = new NumberFormatInfo();
491-
nfi.NumberDecimalSeparator = ".";
492-
double dValue = (double)item.Value;
493-
varValuestr = dValue.ToString(nfi);
489+
DateTime dt = DateTime.SpecifyKind((DateTime)item.Value, DateTimeKind.Utc);
490+
varValuestr = '"' + $"{dt.ToString(CosmosDBHelper.ISO_DATE_FORMAT)}" + '"';
494491
}
495492
else
496-
varValuestr = item.Value.ToString();
497-
498-
varValuestr = varValuestr.Equals("True") ? "true" : varValuestr;
499-
varValuestr = varValuestr.Equals("False") ? "false" : varValuestr;
493+
{
494+
if (item.Value is double)
495+
{
496+
double dValue = (double)item.Value;
497+
varValuestr = dValue.ToString(CultureInfo.InvariantCulture.NumberFormat);
498+
}
499+
else
500+
{
501+
varValuestr = item.Value.ToString();
502+
varValuestr = varValuestr.Equals("True") ? "true" : varValuestr;
503+
varValuestr = varValuestr.Equals("False") ? "false" : varValuestr;
504+
}
505+
}
500506
}
501507
filterProcess = filterProcess.Replace(string.Format($"{item.Name}:"), varValuestr);
502508
}
@@ -512,8 +518,24 @@ private void CreateCosmosQuery(CosmosDBQuery query,ServiceCursorDef cursorDef, I
512518
if (GeneXus.Data.Cosmos.CosmosDBHelper.FormattedAsStringDbType(p1.DbType))
513519
varValuestr = '"' + $"{p1.Value.ToString()}" + '"';
514520
else
515-
varValuestr = p1.Value.ToString();
516-
521+
if (GeneXus.Data.Cosmos.CosmosDBHelper.FormattedAsStringDateDbType(p1.DbType))
522+
{
523+
DateTime dt = DateTime.SpecifyKind((DateTime)p1.Value, DateTimeKind.Utc);
524+
varValuestr = '"' + $"{dt.ToString(CosmosDBHelper.ISO_DATE_FORMAT)}" + '"';
525+
}
526+
else
527+
if (p1.Value is double)
528+
{
529+
double dValue = (double)p1.Value;
530+
varValuestr = dValue.ToString(CultureInfo.InvariantCulture.NumberFormat);
531+
}
532+
else
533+
{
534+
varValuestr = p1.Value.ToString();
535+
varValuestr = varValuestr.Equals("True") ? "true" : varValuestr;
536+
varValuestr = varValuestr.Equals("False") ? "false" : varValuestr;
537+
}
538+
517539
filterProcess = filterProcess.Replace(string.Format($":{p1.ParameterName}:"), varValuestr);
518540
}
519541
}

dotnet/src/dotnetcore/DynService/Cosmos/CosmosDBDataReader.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,9 @@ public string GetDataTypeName(int i)
189189

190190
public DateTime GetDateTime(int i)
191191
{
192-
if (GetAttValue(i) is DateTime value)
193-
return value;
194-
return default(DateTime);
192+
DateTime.TryParseExact(GetAttValue(i).ToString(), CosmosDBHelper.ISO_DATE_FORMAT, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out DateTime dt);
193+
return dt;
194+
195195
}
196196
public decimal GetDecimal(int i)
197197
{

dotnet/src/dotnetcore/DynService/Cosmos/CosmosDBHelper.cs

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Data;
4+
using System.Globalization;
45
using System.Linq;
56
using System.Text.Json.Nodes;
67
using GeneXus.Data.NTier;
@@ -10,6 +11,7 @@ namespace GeneXus.Data.Cosmos
1011
{
1112
internal class CosmosDBHelper
1213
{
14+
internal const string ISO_DATE_FORMAT = "yyyy-MM-ddTHH:mm:ss:fffK";
1315
internal static PartitionKey ToPartitionKey(object value)
1416
{
1517
if (value is double)
@@ -54,7 +56,7 @@ internal static PartitionKey ToPartitionKey(object value)
5456
throw new Exception("Partitionkey can be double, bool or string.");
5557
}
5658
internal static bool AddItemValue(string parmName, string fromName, Dictionary<string, object> values, IDataParameterCollection parms, IEnumerable<VarValue> queryVars, ref JsonObject jsonObject)
57-
{
59+
{
5860
if (!AddItemValue(parmName, values, parms[fromName] as ServiceParameter, ref jsonObject))
5961
{
6062
VarValue varValue = queryVars.FirstOrDefault(v => v.Name == $":{fromName}");
@@ -66,20 +68,36 @@ internal static bool AddItemValue(string parmName, string fromName, Dictionary<s
6668
jsonObject.Add(keyvalue);
6769
}
6870
else
69-
jsonObject.Add(parmName, JsonValue.Create(varValue.Value));
71+
if (FormattedAsStringDateGXType(varValue.Type))
72+
{
73+
DateTime dt = DateTime.SpecifyKind((DateTime)varValue.Value, DateTimeKind.Utc);
74+
jsonObject.Add(parmName, dt.ToString(ISO_DATE_FORMAT));
75+
}
76+
else
77+
jsonObject.Add(parmName, JsonValue.Create(varValue.Value));
7078
values[parmName] = varValue.Value;
7179
}
7280
return varValue != null;
7381
}
7482
return true;
7583
}
76-
public static bool FormattedAsStringGXType(GXType gXType)
84+
85+
internal static bool FormattedAsStringDateGXType(GXType gXType)
86+
{
87+
return (gXType == GXType.Date || gXType == GXType.DateTime || gXType == GXType.DateTime2);
88+
}
89+
internal static bool FormattedAsStringGXType(GXType gXType)
90+
{
91+
return (gXType == GXType.VarChar || gXType == GXType.DateAsChar || gXType == GXType.NVarChar || gXType == GXType.LongVarChar || gXType == GXType.NChar || gXType == GXType.Char || gXType == GXType.Text || gXType == GXType.NText);
92+
}
93+
94+
internal static bool FormattedAsStringDateDbType(DbType dbType)
7795
{
78-
return (gXType == GXType.Date || gXType == GXType.DateTime || gXType == GXType.DateTime2 || gXType == GXType.VarChar || gXType == GXType.DateAsChar || gXType == GXType.NVarChar || gXType == GXType.LongVarChar || gXType == GXType.NChar || gXType == GXType.Char || gXType == GXType.Text || gXType == GXType.NText);
96+
return (dbType == DbType.Date || dbType == DbType.DateTime || dbType == DbType.DateTime2 || dbType == DbType.DateTimeOffset || dbType == DbType.Time);
7997
}
8098
internal static bool FormattedAsStringDbType(DbType dbType)
8199
{
82-
return (dbType == DbType.String || dbType == DbType.Date || dbType == DbType.DateTime || dbType == DbType.DateTime2 || dbType == DbType.DateTimeOffset || dbType == DbType.StringFixedLength || dbType == DbType.AnsiString || dbType == DbType.AnsiStringFixedLength || dbType == DbType.Guid || dbType == DbType.Time);
100+
return (dbType == DbType.String || dbType == DbType.StringFixedLength || dbType == DbType.AnsiString || dbType == DbType.AnsiStringFixedLength || dbType == DbType.Guid);
83101
}
84102
internal static string FormatExceptionMessage(string statusCode, string message)
85103
{
@@ -97,7 +115,13 @@ internal static bool AddItemValue(string parmName, Dictionary<string, object> dy
97115
jsonObject.Add(keyvalue);
98116
}
99117
else
100-
jsonObject.Add(parmName, JsonValue.Create(parm.Value));
118+
if (FormattedAsStringDateDbType(parm.DbType))
119+
{
120+
DateTime dt = DateTime.SpecifyKind((DateTime)parm.Value, DateTimeKind.Utc);
121+
jsonObject.Add(parmName, dt.ToString(ISO_DATE_FORMAT));
122+
}
123+
else
124+
jsonObject.Add(parmName, JsonValue.Create(parm.Value));
101125
dynParm[parmName] = parm.Value;
102126
return true;
103127
}

0 commit comments

Comments
 (0)