Skip to content

Commit e142107

Browse files
committed
Uncomments DateTimeOffset functionality
1 parent 111b79f commit e142107

File tree

5 files changed

+52
-89
lines changed

5 files changed

+52
-89
lines changed

Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Compiler.cs

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,17 @@ public override void Visit(SqlBinary node)
3636
base.Visit(node.NodeType==SqlNodeType.In ? SqlDml.In(node.Left, row) : SqlDml.NotIn(node.Left, row));
3737
}
3838
else {
39-
//switch (node.NodeType) {
40-
// case SqlNodeType.DateTimeOffsetMinusDateTimeOffset:
41-
// (node.Left - node.Right).AcceptVisitor(this);
42-
// return;
43-
// case SqlNodeType.DateTimeOffsetMinusInterval:
44-
// (node.Left - node.Right).AcceptVisitor(this);
45-
// return;
46-
// case SqlNodeType.DateTimeOffsetPlusInterval:
47-
// (node.Left + node.Right).AcceptVisitor(this);
48-
// return;
49-
//}
39+
switch (node.NodeType) {
40+
case SqlNodeType.DateTimeOffsetMinusDateTimeOffset:
41+
(node.Left - node.Right).AcceptVisitor(this);
42+
return;
43+
case SqlNodeType.DateTimeOffsetMinusInterval:
44+
(node.Left - node.Right).AcceptVisitor(this);
45+
return;
46+
case SqlNodeType.DateTimeOffsetPlusInterval:
47+
(node.Left + node.Right).AcceptVisitor(this);
48+
return;
49+
}
5050
base.Visit(node);
5151
}
5252
}
@@ -97,7 +97,6 @@ public override void Visit(SqlFunctionCall node)
9797
case SqlFunctionType.DateTimeToStringIso:
9898
DateTimeToStringIso(node.Arguments[0]).AcceptVisitor(this);
9999
return;
100-
/*
101100
case SqlFunctionType.DateTimeOffsetTimeOfDay:
102101
DateTimeOffsetTimeOfDay(node.Arguments[0]).AcceptVisitor(this);
103102
return;
@@ -113,7 +112,6 @@ public override void Visit(SqlFunctionCall node)
113112
case SqlFunctionType.DateTimeToDateTimeOffset:
114113
SqlDml.Cast(node.Arguments[0], SqlType.DateTimeOffset).AcceptVisitor(this);
115114
return;
116-
*/
117115
}
118116
base.Visit(node);
119117
}
@@ -277,7 +275,6 @@ private static SqlExpression NpgsqlTypeConstructor(SqlExpression left, SqlExpres
277275
SqlDml.Native(")")))));
278276
}
279277

280-
/*
281278
public override void Visit(SqlExtract node)
282279
{
283280
switch (node.DateTimeOffsetPart) {
@@ -300,9 +297,7 @@ public override void Visit(SqlExtract node)
300297
}
301298
base.Visit(node);
302299
}
303-
*/
304300

305-
/*
306301
protected SqlExpression DateTimeOffsetExtractDate(SqlExpression timestamp)
307302
{
308303
return SqlDml.FunctionCall("DATE", timestamp);
@@ -362,15 +357,11 @@ protected SqlExpression ConstructDateTimeOffsetFromExpressions(SqlExpression dat
362357
{
363358
return SqlDml.Cast(SqlDml.Concat(datetimeStringExpression, " ", offsetStringExpression), SqlType.DateTimeOffset);
364359
}
365-
*/
366-
/*
367360
protected SqlExpression GetDateTimeAsStringExpression(SqlExpression dateTimeExpression)
368361
{
369362
return SqlDml.FunctionCall("To_Char", dateTimeExpression, "YYYY-MM-DD\"T\"HH24:MI:SS.MS");
370363
}
371-
*/
372364

373-
/*
374365
protected SqlExpression GetOffsetAsStringExpression(SqlExpression offsetInMinutes)
375366
{
376367
int hours = 0;
@@ -382,9 +373,7 @@ protected SqlExpression GetOffsetAsStringExpression(SqlExpression offsetInMinute
382373
var intervalExpression = offsetInMinutes * OneMinuteInterval;
383374
return IntervalToIsoString(intervalExpression, true);
384375
}
385-
*/
386376

387-
/*
388377
private string ZoneStringFromParts(int hours, int minutes)
389378
{
390379
return string.Format("{0}{1:00}:{2:00}", hours < 0 ? "-" : "+", Math.Abs(hours), Math.Abs(minutes));
@@ -394,16 +383,12 @@ private SqlExpression GetDateTimeInTimeZone(SqlExpression expression, SqlExpress
394383
{
395384
return SqlDml.FunctionCall("TIMEZONE", zone, expression);
396385
}
397-
*/
398386

399-
/*
400387
private SqlExpression GetServerTimeZone()
401388
{
402389
return SqlDml.FunctionCall("CURRENT_SETTING", SqlDml.Literal("TIMEZONE"));
403390
}
404-
*/
405391

406-
/*
407392
private bool TryDivideOffsetIntoParts(SqlExpression offsetInMinutes, ref int hours , ref int minutes)
408393
{
409394
var offsetToDouble = offsetInMinutes as SqlLiteral<double>;
@@ -426,7 +411,7 @@ private bool TryDivideOffsetIntoParts(SqlExpression offsetInMinutes, ref int hou
426411
return true;
427412
}
428413
return false;
429-
}*/
414+
}
430415

431416
// Constructors
432417

Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Driver.cs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
using System;
88
using NpgsqlTypes;
9+
using Xtensive.Reflection.PostgreSql;
910
using Xtensive.Sql.Compiler;
1011
using Xtensive.Sql.Info;
1112

@@ -46,25 +47,21 @@ protected override void RegisterCustomMappings(TypeMappingRegistryBuilder builde
4647
builder.Add(new PathMapper());
4748
builder.Add(new PolygonMapper());
4849
builder.Add(new CircleMapper());
49-
/*
50-
builder.Add(typeof (DateTimeOffset),
50+
builder.Add(WellKnownTypes.DateTimeOffsetType,
5151
builder.Mapper.ReadDateTimeOffset,
5252
builder.Mapper.BindDateTimeOffset,
5353
builder.Mapper.MapDateTimeOffset);
54-
*/
5554
}
5655

5756
protected override void RegisterCustomReverseMappings(TypeMappingRegistryBuilder builder)
5857
{
59-
builder.AddReverse(CustomSqlType.Point, typeof (NpgsqlPoint));
60-
builder.AddReverse(CustomSqlType.LSeg, typeof (NpgsqlLSeg));
61-
builder.AddReverse(CustomSqlType.Box, typeof (NpgsqlBox));
62-
builder.AddReverse(CustomSqlType.Path, typeof (NpgsqlPath));
63-
builder.AddReverse(CustomSqlType.Polygon, typeof (NpgsqlPolygon));
64-
builder.AddReverse(CustomSqlType.Circle, typeof (NpgsqlCircle));
65-
/*
66-
builder.AddReverse(SqlType.DateTimeOffset, typeof (DateTimeOffset));
67-
*/
58+
builder.AddReverse(CustomSqlType.Point, WellKnownTypes.NpgsqlPointType);
59+
builder.AddReverse(CustomSqlType.LSeg, WellKnownTypes.NpgsqlLSegType);
60+
builder.AddReverse(CustomSqlType.Box, WellKnownTypes.NpgsqlBoxType);
61+
builder.AddReverse(CustomSqlType.Path, WellKnownTypes.NpgsqlPathType);
62+
builder.AddReverse(CustomSqlType.Polygon, WellKnownTypes.NpgsqlPolygonType);
63+
builder.AddReverse(CustomSqlType.Circle, WellKnownTypes.NpgsqlCircleType);
64+
builder.AddReverse(SqlType.DateTimeOffset, WellKnownTypes.DateTimeOffsetType);
6865
}
6966

7067
// Constructors

Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Extractor.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -948,10 +948,8 @@ protected SqlValueType GetSqlValueType(string typname, int typmod)
948948
GetPrecisionAndScale(typmod, out precision, out scale);
949949
return new SqlValueType(typeInfo.Type, precision, scale);
950950
}
951-
/*
952951
if (typeInfo.Type==SqlType.DateTimeOffset)
953952
return new SqlValueType(typeInfo.Type);
954-
*/
955953
return typmod!=-1
956954
? new SqlValueType(typeInfo.Type, typmod - 4)
957955
: new SqlValueType(typeInfo.Type);

Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Translator.cs

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using Xtensive.Sql.Ddl;
1212
using Xtensive.Sql.Dml;
1313
using Xtensive.Sql.Drivers.PostgreSql.Resources;
14+
using Xtensive.Reflection.PostgreSql;
1415

1516
namespace Xtensive.Sql.Drivers.PostgreSql.v8_0
1617
{
@@ -22,9 +23,7 @@ internal class Translator : SqlTranslator
2223
public override string FloatFormatString { get { return base.FloatFormatString + "'::float4'"; } }
2324
public override string DoubleFormatString { get { return base.DoubleFormatString + "'::float8'"; } }
2425

25-
/*
2626
public string DateTimeOffsetFormatString { get { return @"\'yyyyMMdd HHmmss.ffffff zzz\''::timestamp(6) with time zone'"; } }
27-
*/
2827

2928

3029
public override void Initialize()
@@ -345,28 +344,24 @@ public override string Translate(SqlCompilerContext context, SqlArray node, Arra
345344

346345
public override string Translate(SqlCompilerContext context, SqlExtract node, ExtractSection section)
347346
{
348-
bool isSecond = node.DateTimePart==SqlDateTimePart.Second
349-
|| node.IntervalPart==SqlIntervalPart.Second
350-
/*|| node.DateTimeOffsetPart==SqlDateTimeOffsetPart.Second*/;
351-
bool isMillisecond = node.DateTimePart==SqlDateTimePart.Millisecond
352-
|| node.IntervalPart==SqlIntervalPart.Millisecond
353-
/*|| node.DateTimeOffsetPart==SqlDateTimeOffsetPart.Millisecond*/;
354-
if (!(isSecond || isMillisecond))
347+
var isSecond = node.DateTimePart == SqlDateTimePart.Second
348+
|| node.IntervalPart == SqlIntervalPart.Second
349+
|| node.DateTimeOffsetPart == SqlDateTimeOffsetPart.Second;
350+
var isMillisecond = node.DateTimePart == SqlDateTimePart.Millisecond
351+
|| node.IntervalPart == SqlIntervalPart.Millisecond
352+
|| node.DateTimeOffsetPart == SqlDateTimeOffsetPart.Millisecond;
353+
if (!(isSecond || isMillisecond)) {
355354
return base.Translate(context, node, section);
355+
}
356356
switch (section) {
357-
case ExtractSection.Entry:
358-
if (isSecond)
359-
return "(trunc(extract(";
360-
return "(extract(";
361-
case ExtractSection.Exit:
362-
if (isMillisecond)
363-
return ")::int8 % 1000)";
364-
if (isSecond)
365-
return ")))";
366-
return ")::int8)";
367-
//return isMillisecond ? ")::int8 % 1000)" : ")::int8)";
368-
default:
369-
return base.Translate(context, node, section);
357+
case ExtractSection.Entry:
358+
return isSecond ? "(trunc(extract(" : "(extract(";
359+
case ExtractSection.Exit:
360+
return isMillisecond
361+
? ")::int8 % 1000)"
362+
: isSecond ? ")))" : ")::int8)";
363+
default:
364+
return base.Translate(context, node, section);
370365
}
371366
}
372367

@@ -794,7 +789,6 @@ public override string Translate(SqlDateTimePart part)
794789
return base.Translate(part);
795790
}
796791

797-
/*
798792
public override string Translate(SqlDateTimeOffsetPart part)
799793
{
800794
switch (part) {
@@ -814,7 +808,6 @@ public override string Translate(SqlDateTimeOffsetPart part)
814808

815809
return base.Translate(part);
816810
}
817-
*/
818811

819812
public override string Translate(SqlLockType lockType)
820813
{

Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/TypeMapper.cs

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System.Security;
1111
using Npgsql;
1212
using NpgsqlTypes;
13+
using Xtensive.Reflection.PostgreSql;
1314

1415

1516
namespace Xtensive.Sql.Drivers.PostgreSql.v8_0
@@ -28,14 +29,18 @@ public override bool IsParameterCastRequired(Type type)
2829
case TypeCode.DateTime:
2930
return true;
3031
}
31-
//if (type==typeof (DateTimeOffset))
32-
// return true;
33-
if (type==typeof(Guid))
32+
if (type == WellKnownTypes.DateTimeOffsetType) {
3433
return true;
35-
if (type==typeof(TimeSpan))
34+
}
35+
if (type == WellKnownTypes.GuidType) {
3636
return true;
37-
if (type==typeof(byte[]))
37+
}
38+
if (type == WellKnownTypes.TimeSpanType) {
3839
return true;
40+
}
41+
if (type == WellKnownTypes.ByteArrayType) {
42+
return true;
43+
}
3944
return false;
4045
}
4146

@@ -123,17 +128,13 @@ public override void BindGuid(DbParameter parameter, object value)
123128
parameter.Value = value==null ? (object) DBNull.Value : SqlHelper.GuidToString((Guid) value);
124129
}
125130

126-
/*
127131
[SecuritySafeCritical]
128132
public override void BindDateTimeOffset(DbParameter parameter, object value)
129133
{
130134
var nativeParameter = (NpgsqlParameter) parameter;
131-
nativeParameter.NpgsqlDbType = NpgsqlDbType.TimestampTZ;
132-
nativeParameter.NpgsqlValue = value!=null
133-
? (object)(NpgsqlTimeStampTZ) (DateTimeOffset) value
134-
: (object)DBNull.Value;
135+
nativeParameter.NpgsqlDbType = NpgsqlDbType.TimestampTz;
136+
nativeParameter.NpgsqlValue = value ?? DBNull.Value;
135137
}
136-
*/
137138

138139
public override SqlValueType MapByte(int? length, int? precision, int? scale)
139140
{
@@ -193,22 +194,11 @@ public override object ReadDecimal(DbDataReader reader, int index)
193194
return nativeReader.GetDecimal(index);
194195
}
195196

196-
/*
197197
[SecuritySafeCritical]
198198
public override object ReadDateTimeOffset(DbDataReader reader, int index)
199199
{
200-
var nativeReader = (NpgsqlDataReader)reader;
201-
return (DateTimeOffset)nativeReader.GetTimeStampTZ(index);
202-
}
203-
*/
204-
205-
protected virtual SqlValueType ReduceDecimalScale(SqlValueType sqlType, int newScale)
206-
{
207-
if (sqlType.Type!=SqlType.Decimal)
208-
return sqlType;
209-
if (!sqlType.Precision.HasValue)
210-
return sqlType;
211-
return new SqlValueType(sqlType.Type, sqlType.Precision.Value, newScale);
200+
var nativeReader = (NpgsqlDataReader) reader;
201+
return nativeReader.GetFieldValue<DateTimeOffset>(index);
212202
}
213203

214204
// Constructors

0 commit comments

Comments
 (0)