1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
/*
* Firebird ADO.NET Data provider for .NET and Mono
*
* The contents of this file are subject to the Initial
* Developer's Public License Version 1.0 (the "License");
* you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
* http://www.firebirdsql.org/index.php?op=doc&id=idpl
*
* Software distributed under the License is distributed on
* an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for the specific
* language governing rights and limitations under the License.
*
* Copyright (c) 2002, 2005 Carlos Guzman Alvarez
* All Rights Reserved.
*/
using System;
using System.Globalization;
namespace FirebirdSql.Data.Common
{
internal sealed class TypeDecoder
{
#region Constructors
private TypeDecoder()
{
}
#endregion
#region Static Methods
public static decimal DecodeDecimal(object value, int scale, int sqltype)
{
long divisor = 1;
decimal returnValue = Convert.ToDecimal(value, CultureInfo.InvariantCulture);
if (scale < 0)
{
divisor = (long)System.Math.Pow(10, scale * (-1));
}
switch (sqltype & ~1)
{
case IscCodes.SQL_SHORT:
case IscCodes.SQL_LONG:
case IscCodes.SQL_QUAD:
case IscCodes.SQL_INT64:
returnValue = returnValue / divisor;
break;
}
return returnValue;
}
public static DateTime DecodeTime(int sql_time)
{
GregorianCalendar calendar = new GregorianCalendar();
int millisInDay = sql_time / 10;
int hour = millisInDay / 3600000;
int minute = (millisInDay - hour * 3600000) / 60000;
int second = (millisInDay - hour * 3600000 - minute * 60000) / 1000;
int millisecond = millisInDay - hour * 3600000 - minute * 60000 - second * 1000;
return new DateTime(1970, 1, 1, hour, minute, second, millisecond, calendar);
}
public static DateTime DecodeDate(int sql_date)
{
int year, month, day, century;
sql_date -= 1721119 - 2400001;
century = (4 * sql_date - 1) / 146097;
sql_date = 4 * sql_date - 1 - 146097 * century;
day = sql_date / 4;
sql_date = (4 * day + 3) / 1461;
day = 4 * day + 3 - 1461 * sql_date;
day = (day + 4) / 4;
month = (5 * day - 3) / 153;
day = 5 * day - 3 - 153 * month;
day = (day + 5) / 5;
year = 100 * century + sql_date;
if (month < 10)
{
month += 3;
}
else
{
month -= 9;
year += 1;
}
DateTime date = new System.DateTime(year, month, day);
return date.Date;
}
#endregion
}
}
|