Ejemplo n.º 1
0
        private static TimeSpan RefreshUtcOffset(ISessionFactory sessionWrapper, ProviderTypeEnum providerType)
        {
            lock (DateOffsetMutex)
            {
                Func <object, DateTime> conversionFunc = a => (DateTime)a;
                using (var session = sessionWrapper.OpenStatelessSession())
                {
                    IQuery query = null;
                    switch (providerType == ProviderTypeEnum.None
                        ? sessionWrapper.DeriveProviderType()
                        : providerType)
                    {
                    case ProviderTypeEnum.OracleClient10Managed:
                    case ProviderTypeEnum.OracleClient9Managed:
                    case ProviderTypeEnum.OracleClient10:
                    case ProviderTypeEnum.OracleClient9:
                        query = session.CreateSQLQuery("select systimestamp at time zone 'UTC' from dual");
                        break;

                    case ProviderTypeEnum.PostgreSQLStandard:
                    case ProviderTypeEnum.PostgreSQL81:
                    case ProviderTypeEnum.PostgreSQL82:
                        query = session.CreateSQLQuery("SELECT NOW() at time zone 'utc'");
                        break;

                    case ProviderTypeEnum.MySQL:
                        query = session.CreateSQLQuery("select utc_timestamp()");
                        break;

                    case ProviderTypeEnum.JetDriver:
                    case ProviderTypeEnum.SQLite:
                        query = null;
                        break;

                    case ProviderTypeEnum.DB2Informix1150:
                        query          = session.CreateSQLQuery("select dbinfo('utc_current')");
                        conversionFunc = o =>
                        {
                            var seconds = Convert.ToInt32(o);
                            return(new DateTime(1970, 1, 1).AddSeconds(seconds));
                        };
                        break;

                    case ProviderTypeEnum.SQLAnywhere10:
                    case ProviderTypeEnum.SQLAnywhere9:
                    case ProviderTypeEnum.SQLAnywhere11:
                    case ProviderTypeEnum.SQLAnywhere12:
                        query = session.CreateSQLQuery("select CURRENT UTC TIMESTAMP");
                        break;

                    case ProviderTypeEnum.MsSql2000:
                    case ProviderTypeEnum.MsSql2005:
                    case ProviderTypeEnum.MsSql2008:
                    case ProviderTypeEnum.MsSql2012:
                        query = session.CreateSQLQuery("select getutcdate()");
                        break;

                    case ProviderTypeEnum.DB2Standard:
                        query = session.CreateSQLQuery("select CURRENT TIMESTAMP - CURRENT TIME ZONE");
                        break;

                    case ProviderTypeEnum.Firebird:
                    case ProviderTypeEnum.MsSqlCe40:
                    default:
                        throw new NotImplementedException(
                                  string.Format("This feature is not supported for provider {0}",
                                                providerType == ProviderTypeEnum.None
                                        ? sessionWrapper.DeriveProviderType()
                                        : providerType));
                    }

                    if (query != null)
                    {
                        var stopwatch = new Stopwatch();
                        var current   = DateTime.UtcNow;
                        stopwatch.Start();
                        var serverUtc = conversionFunc(query.UniqueResult());
                        stopwatch.Stop();
                        return(serverUtc.Subtract(current).Subtract(stopwatch.Elapsed));
                    }

                    return(TimeSpan.Zero);
                }
            }
        }