Skip to content

Commit e81fcab

Browse files
Port SAP B1 ExtraProperties hook for stringized DateTime literals
Re-apply the GeneXus extension that lets consumers opt into wrapping DateTime URI literals in single quotes (required by some SAP B1 services that do not accept proper OData datetime syntax). - ODataClientSettings: add a Properties bag and a static ExtraProperties helper exposing the STRINGIZE_DATETIME_VALUES key. The session-cloning constructor copies Properties. - ODataExpression.Format.cs: when formatting a DateTime value, consult Settings.Properties for the opt-in flag and wrap the literal in single quotes when enabled. Original commit: dc14c7f 'add support for Extra Properties on ODataClientSettings'. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 300adbf commit e81fcab

3 files changed

Lines changed: 48 additions & 1 deletion

File tree

src/GXOdata.Client.All/GXOData.Client.All.xml

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Simple.OData.Client.Core/Expressions/ODataExpression.Format.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,15 @@ private string FormatValue(ExpressionContext context)
267267
}
268268
else
269269
{
270-
return context.Session.Adapter.GetCommandFormatter().ConvertValueToUriLiteral(Value, false);
270+
var uriLiteral = context.Session.Adapter.GetCommandFormatter().ConvertValueToUriLiteral(Value, false);
271+
// SAP B1 services do not accept proper OData datetime literals but do accept
272+
// single-quoted ones. Consumers opt in via ODataClientSettings.Properties.
273+
if (Value is DateTime &&
274+
(context.Session.Settings.Properties?[ODataClientSettings.ExtraProperties.STRINGIZE_DATETIME_VALUES] as bool? == true))
275+
{
276+
return $"'{uriLiteral}'";
277+
}
278+
return uriLiteral;
271279
}
272280
}
273281

src/Simple.OData.Client.Core/ODataClientSettings.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,12 @@ public INameMatchResolver NameMatchResolver
241241
/// </value>
242242
public ODataUpdateMethod PreferredUpdateMethod { get; set; }
243243

244+
/// <summary>
245+
/// Gets or sets a bag of extra properties used to opt into provider-specific behaviors
246+
/// (e.g. <see cref="ExtraProperties.STRINGIZE_DATETIME_VALUES"/> for SAP B1 services).
247+
/// </summary>
248+
public Dictionary<string, object>? Properties { get; set; }
249+
244250
/// <summary>
245251
/// Gets or sets the value that indicates either to read untyped properties as strings.
246252
/// </summary>
@@ -423,6 +429,7 @@ internal ODataClientSettings(ISession session)
423429
OnTrace = session.Settings.OnTrace;
424430
PayloadFormat = session.Settings.PayloadFormat;
425431
PreferredUpdateMethod = session.Settings.PreferredUpdateMethod;
432+
Properties = session.Settings.Properties is null ? null : new Dictionary<string, object>(session.Settings.Properties);
426433
ReadUntypedAsString = session.Settings.ReadUntypedAsString;
427434
RenewHttpConnection = session.Settings.RenewHttpConnection;
428435
RequestExecutor = session.Settings.RequestExecutor;
@@ -435,4 +442,17 @@ internal ODataClientSettings(ISession session)
435442

436443
#endregion
437444

445+
/// <summary>
446+
/// Keys for the <see cref="ODataClientSettings.Properties"/> bag, used to opt into
447+
/// provider-specific behaviors.
448+
/// </summary>
449+
public static class ExtraProperties
450+
{
451+
/// <summary>
452+
/// When set to a truthy value, the client renders DateTime literals as single-quoted
453+
/// strings instead of the standard OData datetime syntax (required by some SAP B1
454+
/// services that do not accept proper datetimes).
455+
/// </summary>
456+
public const string STRINGIZE_DATETIME_VALUES = "StringizeDatetimeValues";
457+
}
438458
}

0 commit comments

Comments
 (0)