Revert "Adding Milliseconds to DateTime fields (#173)" (#197)

This reverts commit 431dfa4156.
This commit is contained in:
Benjamin Russell
2016-12-16 16:37:32 -08:00
committed by Karl Burtram
parent dee08e7494
commit a41977b592
5 changed files with 45 additions and 126 deletions

View File

@@ -5,7 +5,6 @@
using System; using System;
using System.Data.SqlTypes; using System.Data.SqlTypes;
using Microsoft.SqlTools.ServiceLayer.QueryExecution.Contracts;
namespace Microsoft.SqlTools.ServiceLayer.QueryExecution.DataStorage namespace Microsoft.SqlTools.ServiceLayer.QueryExecution.DataStorage
{ {
@@ -26,7 +25,7 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution.DataStorage
int WriteDouble(double val); int WriteDouble(double val);
int WriteDecimal(decimal val); int WriteDecimal(decimal val);
int WriteSqlDecimal(SqlDecimal val); int WriteSqlDecimal(SqlDecimal val);
int WriteDateTime(DbColumnWrapper column, DateTime val); int WriteDateTime(DateTime val);
int WriteDateTimeOffset(DateTimeOffset dtoVal); int WriteDateTimeOffset(DateTimeOffset dtoVal);
int WriteTimeSpan(TimeSpan val); int WriteTimeSpan(TimeSpan val);
int WriteString(string val); int WriteString(string val);

View File

@@ -260,26 +260,11 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution.DataStorage
/// <returns>A DateTime</returns> /// <returns>A DateTime</returns>
public FileStreamReadResult ReadDateTime(long offset) public FileStreamReadResult ReadDateTime(long offset)
{ {
int precision = 0; return ReadCellHelper(offset, length =>
{
return ReadCellHelper(offset, long ticks = BitConverter.ToInt64(buffer, 0);
length => return new DateTime(ticks);
{ });
precision = BitConverter.ToInt32(buffer, 0);
long ticks = BitConverter.ToInt64(buffer, 4);
return new DateTime(ticks);
}, null,
time =>
{
string format = "yyyy-MM-dd HH:mm:ss";
if (precision > 0)
{
// Output the number milliseconds equivalent to the precision
// NOTE: string('f', precision) will output ffff for precision=4
format += "." + new string('f', precision);
}
return time.ToString(format);
});
} }
/// <summary> /// <summary>

View File

@@ -38,7 +38,7 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution.DataStorage
/// <summary> /// <summary>
/// Functions to use for writing various types to a file /// Functions to use for writing various types to a file
/// </summary> /// </summary>
private readonly Dictionary<Type, Func<object, DbColumnWrapper, int>> writeMethods; private readonly Dictionary<Type, Func<object, int>> writeMethods;
#endregion #endregion
@@ -74,78 +74,37 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution.DataStorage
this.maxXmlCharsToStore = maxXmlCharsToStore; this.maxXmlCharsToStore = maxXmlCharsToStore;
// Define what methods to use to write a type to the file // Define what methods to use to write a type to the file
writeMethods = new Dictionary<Type, Func<object, DbColumnWrapper, int>> writeMethods = new Dictionary<Type, Func<object, int>>
{ {
{typeof(string), (val, col) => WriteString((string) val)}, {typeof(string), val => WriteString((string) val)},
{typeof(short), (val, col) => WriteInt16((short) val)}, {typeof(short), val => WriteInt16((short) val)},
{typeof(int), (val, col) => WriteInt32((int) val)}, {typeof(int), val => WriteInt32((int) val)},
{typeof(long), (val, col) => WriteInt64((long) val)}, {typeof(long), val => WriteInt64((long) val)},
{typeof(byte), (val, col) => WriteByte((byte) val)}, {typeof(byte), val => WriteByte((byte) val)},
{typeof(char), (val, col) => WriteChar((char) val)}, {typeof(char), val => WriteChar((char) val)},
{typeof(bool), (val, col) => WriteBoolean((bool) val)}, {typeof(bool), val => WriteBoolean((bool) val)},
{typeof(double), (val, col) => WriteDouble((double) val) }, {typeof(double), val => WriteDouble((double) val) },
{typeof(float), (val, col) => WriteSingle((float) val) }, {typeof(float), val => WriteSingle((float) val) },
{typeof(decimal), (val, col) => WriteDecimal((decimal) val) }, {typeof(decimal), val => WriteDecimal((decimal) val) },
{typeof(DateTime), (val, col) => WriteDateTime(col, (DateTime) val) }, {typeof(DateTime), val => WriteDateTime((DateTime) val) },
{typeof(DateTimeOffset), (val, col) => WriteDateTimeOffset((DateTimeOffset) val) }, {typeof(DateTimeOffset), val => WriteDateTimeOffset((DateTimeOffset) val) },
{typeof(TimeSpan), (val, col) => WriteTimeSpan((TimeSpan) val) }, {typeof(TimeSpan), val => WriteTimeSpan((TimeSpan) val) },
{typeof(byte[]), (val, col) => WriteBytes((byte[]) val)}, {typeof(byte[]), val => WriteBytes((byte[]) val)},
{ {typeof(SqlString), val => WriteNullable((SqlString) val, obj => WriteString((string) obj))},
typeof(SqlString), {typeof(SqlInt16), val => WriteNullable((SqlInt16) val, obj => WriteInt16((short) obj))},
(val, col) => WriteNullable((SqlString) val, obj => WriteString((string) obj)) {typeof(SqlInt32), val => WriteNullable((SqlInt32) val, obj => WriteInt32((int) obj))},
}, {typeof(SqlInt64), val => WriteNullable((SqlInt64) val, obj => WriteInt64((long) obj)) },
{ {typeof(SqlByte), val => WriteNullable((SqlByte) val, obj => WriteByte((byte) obj)) },
typeof(SqlInt16), {typeof(SqlBoolean), val => WriteNullable((SqlBoolean) val, obj => WriteBoolean((bool) obj)) },
(val, col) => WriteNullable((SqlInt16) val, obj => WriteInt16((short) obj)) {typeof(SqlDouble), val => WriteNullable((SqlDouble) val, obj => WriteDouble((double) obj)) },
}, {typeof(SqlSingle), val => WriteNullable((SqlSingle) val, obj => WriteSingle((float) obj)) },
{ {typeof(SqlDecimal), val => WriteNullable((SqlDecimal) val, obj => WriteSqlDecimal((SqlDecimal) obj)) },
typeof(SqlInt32), {typeof(SqlDateTime), val => WriteNullable((SqlDateTime) val, obj => WriteDateTime((DateTime) obj)) },
(val, col) => WriteNullable((SqlInt32) val, obj => WriteInt32((int) obj)) {typeof(SqlBytes), val => WriteNullable((SqlBytes) val, obj => WriteBytes((byte[]) obj)) },
}, {typeof(SqlBinary), val => WriteNullable((SqlBinary) val, obj => WriteBytes((byte[]) obj)) },
{ {typeof(SqlGuid), val => WriteNullable((SqlGuid) val, obj => WriteGuid((Guid) obj)) },
typeof(SqlInt64), {typeof(SqlMoney), val => WriteNullable((SqlMoney) val, obj => WriteMoney((SqlMoney) obj)) }
(val, col) => WriteNullable((SqlInt64) val, obj => WriteInt64((long) obj))
},
{
typeof(SqlByte),
(val, col) => WriteNullable((SqlByte) val, obj => WriteByte((byte) obj))
},
{
typeof(SqlBoolean),
(val, col) => WriteNullable((SqlBoolean) val, obj => WriteBoolean((bool) obj)) },
{
typeof(SqlDouble),
(val, col) => WriteNullable((SqlDouble) val, obj => WriteDouble((double) obj))
},
{
typeof(SqlSingle),
(val, col) => WriteNullable((SqlSingle) val, obj => WriteSingle((float) obj))
},
{
typeof(SqlDecimal),
(val, col) => WriteNullable((SqlDecimal) val, obj => WriteSqlDecimal((SqlDecimal) obj))
},
{
typeof(SqlDateTime),
(val, col) => WriteNullable((SqlDateTime) val, obj => WriteDateTime(col, (DateTime) obj))
},
{
typeof(SqlBytes),
(val, col) => WriteNullable((SqlBytes) val, obj => WriteBytes((byte[]) obj))
},
{
typeof(SqlBinary),
(val, col) => WriteNullable((SqlBinary) val, obj => WriteBytes((byte[]) obj))
},
{
typeof(SqlGuid),
(val, col) => WriteNullable((SqlGuid) val, obj => WriteGuid((Guid) obj))
},
{
typeof(SqlMoney),
(val, col) => WriteNullable((SqlMoney) val, obj => WriteMoney((SqlMoney) obj))
}
}; };
} }
@@ -231,10 +190,10 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution.DataStorage
} }
// Use the appropriate writing method for the type // Use the appropriate writing method for the type
Func<object, DbColumnWrapper, int> writeMethod; Func<object, int> writeMethod;
if (writeMethods.TryGetValue(tVal, out writeMethod)) if (writeMethods.TryGetValue(tVal, out writeMethod))
{ {
rowBytes += writeMethod(values[i], ci); rowBytes += writeMethod(values[i]);
} }
else else
{ {
@@ -395,25 +354,12 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution.DataStorage
} }
/// <summary> /// <summary>
/// Writes a DateTime to the file as precision and ticks /// Writes a DateTime to the file
/// </summary> /// </summary>
/// <returns>Number of bytes used to store the DateTime</returns> /// <returns>Number of bytes used to store the DateTime</returns>
public int WriteDateTime(DbColumnWrapper col, DateTime dtVal) public int WriteDateTime(DateTime dtVal)
{ {
// Length return WriteInt64(dtVal.Ticks);
var length = WriteLength(12);
// Precision
intBuffer[0] = col.NumericScale ?? 3;
Buffer.BlockCopy(intBuffer, 0, byteBuffer, 0, 4);
// Ticks
longBuffer[0] = dtVal.Ticks;
Buffer.BlockCopy(longBuffer, 0, byteBuffer, 4, 8);
length += WriteHelper(byteBuffer, 12);
return length;
} }
/// <summary> /// <summary>

View File

@@ -8,9 +8,7 @@ using System.Collections.Generic;
using System.Data.SqlTypes; using System.Data.SqlTypes;
using System.IO; using System.IO;
using System.Text; using System.Text;
using Microsoft.SqlTools.ServiceLayer.QueryExecution.Contracts;
using Microsoft.SqlTools.ServiceLayer.QueryExecution.DataStorage; using Microsoft.SqlTools.ServiceLayer.QueryExecution.DataStorage;
using Microsoft.SqlTools.ServiceLayer.Test.Utility;
using Moq; using Moq;
using Xunit; using Xunit;
@@ -231,21 +229,18 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.QueryExecution.DataStorage
} }
} }
[Theory] [Fact]
[InlineData(3)] // Scale 3 = DATETIME public void DateTimeTest()
[InlineData(7)] // Scale 7 = DATETIME2
public void DateTimeTest(int scale)
{ {
// Setup: Create some test values and a column with scale set // Setup: Create some test values
// NOTE: We are doing these here instead of InlineData because DateTime values can't be written as constant expressions // NOTE: We are doing these here instead of InlineData because DateTime values can't be written as constant expressions
DbColumnWrapper col = new DbColumnWrapper(new TestDbColumn("dbcol", scale));
DateTime[] testValues = DateTime[] testValues =
{ {
DateTime.Now, DateTime.UtcNow, DateTime.MinValue, DateTime.MaxValue DateTime.Now, DateTime.UtcNow, DateTime.MinValue, DateTime.MaxValue
}; };
foreach (DateTime value in testValues) foreach (DateTime value in testValues)
{ {
VerifyReadWrite(sizeof(long) + sizeof(int) + 1, value, (writer, val) => writer.WriteDateTime(col, val), reader => reader.ReadDateTime(0)); VerifyReadWrite(sizeof(long) + 1, value, (writer, val) => writer.WriteDateTime(val), reader => reader.ReadDateTime(0));
} }
} }

View File

@@ -17,11 +17,5 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Utility
base.DataType = typeof(string); base.DataType = typeof(string);
base.DataTypeName = "nvarchar"; base.DataTypeName = "nvarchar";
} }
public TestDbColumn(string columnName, int numericScale)
: this(columnName)
{
base.NumericScale = numericScale;
}
} }
} }